[baseten-users] Setting a relationship to nil [Not solved]
Réjean Lamy
rejean.lamy at mac.com
Wed May 6 07:04:40 EEST 2009
Hi
It was too good news.
One thing I forgot after modifs in IB was to update my code that set
the manager to nil according to new binding.
Long story short, its _not_ working at all. headache ++
Rejean Lamy
Le 09-05-05 à 21:51, Réjean Lamy a écrit :
> Hi
>
> My problem seems solved this way (excuse my poor english):
>
> DepartmentView.nib objects binding
> -------------------------------------------------
>
> - Before (caused problems when I want to set to nil the manager
> relationship)
>
> DbContextBX <-> DeptsBXAC <-> NSTableView (display Dept's names)
> ^
> |
> -> NSArrayController <-> NSTableView (display
> Dept's employees names
>
> BXDatabaseContext connected to the depts database
> BXSynchronizedArrayController named "DeptsBXAC" connected to the db
> context and the Department db table
> NSArrayController named "EmployeeList" with Content Set binded to
> DeptsBXAC.selection.employees
>
> NSTableView for departments display, with column binded to
> DeptsBXAC.arrangedObjects.deptName
> NSTableView for employees display, with column binded to
> EmployeeList.arrangedObjects.firstName
>
> - After (seems working ok)
>
> DbContextBX <-> DeptsBXAC <-> NSArrayController <-> NSTableView
> (display Dept's names)
> ^
> |
> -> NSArrayController <-> NSTableView (display Dept's
> employees names)
>
>
> BXDatabaseContext connected to the depts database (no change)
> BXSynchronizedArrayController named "DeptsBXAC" connected to the db
> context and the Department db table (no change)
> NSArrayController named "DeptList" with Content Array binded to
> DeptsBXAC.arrangedObjects (addition)
> NSArrayController named "EmployeeList" with Content set binded to
> DepList.selection.employees (modification, binded to the new DepList
> instead of DeptsBXAC)
>
> NSTableView for departments display, with column binded to
> DeptList.arrangedObjects.deptName 9modification, binded to the new
> DeptList instead of DeptsBXAC)
> NSTableView for employees display, with column binded to
> EmployeeList.arrangedObjects.firstName (no change)
>
>
>
> Summary:
>
> I think my problem originate because my poor understanding of how to
> well design in IB, the connections between BX objects,
> NSArrayControllers and NSTableViews or maybe there is something to
> fix in the BX controllers ?
>
> I observe It seems better not to bind an NSTableView directly to
> BXSynchronizedArrayController, at least in my case, where I am
> doing some manipulation on relationship (ex: setting manager to
> nil). I first doing this in line with the original Hillegass example
> with CoreData.
>
> My working case involved to add a level of indirection, i.e. bind
> the NSTableViews to NSArrayControllers.
> I would like BaseTen developers confirms if I am ok (and, if
> possible explain us why ?... ).
>
> Is somebody experimented similar problem ? Some advises ?
>
> Thanks
>
> Rejean Lamy
>
>
> Le 09-05-05 à 13:21, Réjean Lamy a écrit :
>
>> Hi !
>>
>> ... more details about my problem:
>>
>> I can reproduce the pattern.
>>
>> My test case:
>>
>> - I have entered some departments (Dept-A, Dept-B and Dept-C)
>> - and employees (Empl-1, Empl-2, Empl-3)
>> - all employees are the Dept-A
>>
>> Starting the Application everything is fine, I can select Dept-A,
>> all employees are listed ok, and I can select a manager, change it,
>> all ok, no error message in the console.
>> Selecting Dept-B or Dept-C displayed empty employees list with no
>> manager, so far so good.
>>
>> Now, with Dept-A selected, when I set the manager relationship to
>> nil by pressing a button (see my code at the end of this email),
>> the manager popup showed "No value", perfect (using Navicat or
>> Postgres admin, I can see the manager relationship to NULL), its ok.
>>
>> Next, always with Dept-A selected I change the manager popup from
>> "No Value" to an employee say "Empl-1", the change is done, but the
>> following error appear in the console:
>>
>> 2009-05-05 12:01:37.481 Departments[3240:10b] Cannot remove an
>> observer <NSKeyValueObservance 0x108f870> for the key path
>> "firstName" from <BXDatabaseObject 0x1090310> because it is not
>> registered as an observer.
>>
>> ... from there, always with Dept-A selected, if I changed the
>> manager from "Empl-1" to say "Empl-2" , now the following error
>> showed in the console:
>>
>> 2009-05-05 12:11:16.654 Departments[3240:10b] Cannot remove an
>> observer <BXSynchronizedArrayController 0x1077250> for the key path
>> "manager.firstName" from <Department 0x109e3c0>, most likely
>> because the value for the key "manager" has changed without an
>> appropriate KVO notification being sent. Check the KVO-compliance
>> of the Department class.
>>
>> ... from this point, things goes very bad, if I switch from "Dept-
>> A" to "Dept-B", I see the "Dept-B" employees table populated with
>> the Dept-A employees !
>> (there is no employees in Dept-B) !
>> Is the tables changed ? No, I start Postgres Admin or Navicat and
>> see all employees are well in "Dept-A". Dept-B show no employees.
>>
>> ... now fun things, switching between Dept-A then Dept-B
>> selection, one time Dept-B showed no employees the second time Dept-
>> B showed all the Dept-A employees. Switching again and again
>> displayed exactly the same pattern. Once on two Dept-B listed the
>> Dept-A employees.
>>
>> From the error messages showed in the console, something seems
>> going out of sync in BXSynchronizedArrayController.
>>
>> Again, if I don't set the manager relationship to nil, no problem
>> at all.
>> But the time the manager is set to nil... boom !! (no crash but
>> inconsistencies )
>>
>> Following is the code used I wrote to set a manager to nil on
>> button click:
>>
>> ---------------------------------
>>
>> // DepartmentViewController.h
>> #import "ManagingViewController.h"
>>
>> @interface DepartmentViewController : ManagingViewController {
>> IBOutlet NSArrayController *deptAC;
>> IBOutlet NSTextField *textfield;
>> }
>>
>> - (IBAction) setManagerToNil: (id) sender;
>>
>> @end
>>
>> ---------------------------------
>>
>> // DepartmentViewController.m
>> #import "DepartmentViewController.h"
>> #import "Department.h"
>>
>> static NSString *selectedEmployeeContext =
>> @"selectedEmployeeContext";
>>
>> @implementation DepartmentViewController
>>
>> // init method is Hillegass unchanged code
>> - (id)init
>> {
>> if (![super initWithNibName:@"DepartmentView"
>> bundle:nil])
>> return nil;
>> [self setTitle:@"Departments"];
>> return self;
>> }
>>
>>
>> // I added a Button "Set Manager to nil" in the Department view
>> - (IBAction) setManagerToNil: (id) sender
>> {
>> NSBeep();
>> NSUInteger index = [deptAC selectionIndex]; // the
>> selected department index
>> Department *department = [[deptAC arrangedObjects]
>> objectAtIndex:index]; // the selected department object
>>
>> [department setManager:nil]; // !!! Things will goes bad
>> if manager relationship is set to nil :(
>>
>> // [department setValue:nil forKey:@"manager"]; // alternate
>> way I tried, but with same results
>> // [department setPrimitiveValue:nil forKey:@"manager"]; // same
>> results too ...
>> }
>> @end
>>
>> ---------------------------------
>> //Department.h
>> #import <BaseTen/BaseTen.h>
>>
>> @class Employee;
>>
>> @interface Department : BXDatabaseObject { }
>> @property (retain) NSString * deptName;
>> @property (retain) Employee * manager;
>> @property (retain) NSMutableSet* employees;
>> @end
>>
>> ---------------------------------
>> //Department.m
>> #import "Department.h"
>>
>> @implementation Department
>> @dynamic deptName;
>> @dynamic manager;
>> @dynamic employees;
>> @end
>> ---------------------------------
>>
>>
>> Any ideas ?
>>
>> Rejean lamy
>>
>> PS: I used BaseTen 1.6.2 and also experimented with compiling
>> frameworks from svn trunk, but same results.
>> PS2: Good work BX staff on trunk, I appreciated now to be able to
>> use the same Xcode model name for the to-many relationship (i.e.
>> "employees")
>>
>>
>> Début du message réexpédié :
>>
>>> De : Tuukka Norri <tuukka.norri at karppinen.fi>
>>> Date : 5 mai 2009 10:50:19 HAE
>>> À : BaseTen-Users <baseten-users at lists.basetenframework.org>
>>> Objet : Rép : [baseten-users] Setting a relationship to nil
>>> Répondre à : BaseTen-Users <baseten-
>>> users at lists.basetenframework.org>
>>>
>>> Réjean Lamy kirjoitti 5.5.2009 kello 15.02:
>>>> I would like to know if this is legal to set a relationship to
>>>> "nil" like this:
>>>>
>>>> [department setManager:nil];
>>>
>>> Hi!
>>> This should be perfectly alright. If you have some new sample
>>> code, please send it if you can, and we'll see if there's a bug.
>>> --
>>> Best regards,
>>> Tuukka Norri
>>> MK&C
>>>
>>> _______________________________________________
>>> baseten-users mailing list
>>> baseten-users at lists.basetenframework.org
>>> http://lists.basetenframework.org/mailman/listinfo/baseten-users
>>
>
More information about the baseten-users
mailing list