2011-07-17 52 views
0

我想知道如何以编程方式更新核心数据对象。该对象虽然是NSSet。因此,我可以用下面的方式总结一下:如何使用核心数据存储NSSet(一对多)?

Property 
--------- 
name 
price 
typology 

Property_has_typology 
--------------------- 
typology_id 
property 

,该场所和Property_has_typology之间的一个一对多的关系。作为一个物业可能有几种类型(又名类别),如床&早餐,别墅,酒店,大厦,乡间别墅。

所以我让用户在我的TableView中选择多行,当他点击保存我想存储这些更改。所以,我做的:

NSMutableArray *storeItems = [[NSMutableArray alloc] init]; 

//Get selected items 
for (int i = 0; i < [items count]; i++) { 
    Properties_has_typology *typo = [NSEntityDescription insertNewObjectForEntityForName:@"Properties_has_typology" 
                    inManagedObjectContext: [PropertyProvider sharedPropertyProvider].context]; 
    typo.typology_id = [NSNumber numberWithInt: (int)[items objectAtIndex:i]]; 
    typo.property = property; 
    [storeItems addObject: typo]; 
} 

//Store the items for the Property and save it 
if ([storeItems count] > 0) { 
    NSLog(@"Going to save..."); 
    NSSet *storeSet = [[NSSet alloc] initWithArray:storeItems]; 
    property.typology = storeSet; 

    [property save]; 

    [storeSet release]; 
} 

这有点儿工作,问题是,虽然它并没有真正更新现有的值。它只是压倒它。所以,如果我救了相同的两个项目两次(就像一个例子)我会得到我的数据库中以下内容:

PK TYPOLOGY 
------------ 
1 | 
2 | 
3 | 4 
4 | 6 

所以,是的,他们正在储存,但是也带来了空行(清除它们而不是删除/更新它们)。

任何帮助,将不胜感激。谢谢!

回答

0
//call 
NSArray* oldTypos = [property.typology allObjects]; 
[[property removeTypology:[PropertyProvider sharedPropertyProvider].context]; 
[[property addTypology:storeSet]; 
for(int i = 0; i < [oldTypos count]; i++){ 
[[PropertyProvider sharedPropertyProvider].context deleteObject:[oldTypos:objectAtIndex:i]]; 
} 
Error* error = nil; 
if(![[PropertyProvider sharedPropertyProvider].context save:&error]){ 
abort(); 
} 
//Also, rename the to-many relationship to plural. 

道歉有任何错别字。我现在在我的Windows机器上,所以我无法检查它。

+0

看起来''deleteObject'确实是我正在寻找的东西。现在我可以完全删除所有条目并插入新条目。谢谢! – Jules

0

TechZen说:我,我颠倒父所描述的一对多关系,事后才注意到。但是,一切都以同样的方式工作。当我找到时间时我会编辑。

您正在努力通过手动执行Core Data自动执行的操作。要设置一个关系,您只需设置它的一侧,并且托管对象上下文自动设置另一侧。

所以,如果你有这样一个数据模型:

Property{ 
    typology<<-->Property_has_typology.properties 
} 

Property_has_typology{ 
    properties<-->>Property.typology 
} 

然后设置从Property物体侧的关系,你只需使用:

aPropertyObject.typology=aProperty_has_typologyObject; 

设置如果从Property_has_typology对象方面你使用关系访问器方法在实现(.m)中为你的Core Data生成:

[aProperty_has_typologyObject addPropertiesObject:aPropertyObject]; 

[aProperty_has_typologyObject addPropertiesObjects:aSetOfPropertyObjects]; 

...和你做。

如果您必须手动管理所有对象关系,则核心数据不会提供太多实用工具。

+0

是的我已经设置了所有这些功能,但是当我使用这些方法时,它仍然存储对数据库中其他参考的引用。所以我做'[property addTypologyObject:typo];'但似乎**添加**它。即使做'[property removeTypology:property.typology];'(应该删除整个类型的引用imo)它仍然保留记录在我的问题中所述的数据库中。 – Jules

+0

从关系中删除对象不会删除它,它只是切断关系。如果你想删除一个对象,你需要使用'[NSManagedObjectContext deleteObject:]' – TechZen

+0

当你使用一个名为'addTypologyObject'的方法时,你期望发生什么?我认为你误解了关于核心数据的一些重要问题。你提到的两种方法都不像你认为他们应该做的那样。 – TechZen

相关问题