[baseten-users] Setting a relationship to nil [last word]
Réjean Lamy
rejean.lamy at mac.com
Wed May 6 07:40:20 EEST 2009
Hi again...
I adjusted my code with new binding and now it works !
- (void) setManagerToNil: (id) sender
{
NSBeep();
NSArray *selectedDepts = [deptList selectedObjects];
NSUInteger index = [deptList selectionIndex];
Department *department = [[deptList arrangedObjects]
objectAtIndex:index];
[department setManager:nil];
}
One thing remains very strange, when I do equivalent logic but from
the employee view like this:
- (IBAction) setManagerToNil: (id) sender
{
NSBeep();
NSArray *selectedEmpoyees = [emplList selectedObjects];
NSUInteger index = [emplList selectionIndex];
Employee *employee = [[emplList arrangedObjects]
objectAtIndex:index];
Department *department = [employee valueForKey:@"department"];
[department setManager:nil];
[department setManager:nil];
}
...I must press the button twice to see the manager popup displayed
"No value" in the dept view.
So my work-around was to call the method [department setManager:nil]
twice. But this is a sign of something wrong.
When I monitor the Department db table with Navicat I can see the
manager is set to NULL on the first call to [department
setManager:nil] but the manager popup in the Dept's view is updated to
"No Value" only on the second call. Bizarre !
Thanks to all that try to follow me in this BX adventure.
Time to sleep now.
Rejean lamy
Le 09-05-06 à 00:04, Réjean Lamy a écrit :
> 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