如何在Core Data中保存上下文

时间:2013-09-18 09:22:20

标签: objective-c xcode core-data updating

我的应用中有数据库。我使用核心数据。我需要使用来自服务器的信息刷新本地数据库。我想减少更新DB的时间。 假设我有一个包含3个字段“ID”,“名称”,“文件”的表。在“文件”属性中保存了一些大的二进制数据。这是更新我的数据库的代码。

NSEntityDescription *entity=[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:entity];
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"ID == %@", newObject.objectID];
[fetch setPredicate:predicate];
NSError *fetchError;
NSArray *fetchedEntities = [managedObjectContext executeFetchRequest:fetch error:&fetchError];
NSManagedObject *objectToUpdate = [fetchedEntities firstObject];
objectToupdate.name = newObject.name;
BOOL isRecordUpdated = objectToupdate.isUpdated; // returns YES.
NSError *saveError;
[managedObjectContext save:&saveError];

我找到了一张带ID的记录,并更改了名称,然后保存了上下文。对象已更改,我可以确定它已在服务器上更新。问题是更新是如何工作的。它会重写整个记录吗?我的意思是“文件”属性会发生什么呢?它也被重写了吗?如果是,那么如何避免重写未更改的大字段。

还有一个案例。如果我用一个新的相等的字符串重写名称怎么办?

NSString *name = [NSString stringWithFormat:@"%@", objectToUpdate.name];
BOOL nameChanged = firstName != contact.firstName; // returns YES
BOOL nameIsEqual = [firstName isEqualToString:contact.firstName]; //returns YES
objectToUpdate.name = name;
BOOL hasChanges = [NSManagedObjectContext.defaultContext hasChanges]; //returns YES

我没有更改名称内容,但我更改了名称值。如果我保存上下文,它会重写数据库吗? 这个问题的目的是了解如何有效地处理核心数据。我应该编写自定义属性来比较字符串的内容,还是应该将大数据存储在不同的表中? 感谢您阅读到目前为止,并且对于冗长感到抱歉。

1 个答案:

答案 0 :(得分:1)

我建议将不经常更新的属性(特别是如果它们很大)拆分到与父实体具有1:1关系的单独实体中。这有两个好处:1。当您获取父实体时,如果您不访问它,则子实体仍然是“错误”;如果您只更改父实体的属性,则它不需要数据库写入。 / p>