0

我的应用程序中有一个数据库。我使用核心数据。我需要使用来自服务器的信息刷新我的本地数据库。我想减少更新数据库的时间。假设我有一个包含 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

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

4

1 回答 1

1

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

于 2013-09-18T09:50:58.440 回答