我的应用程序中有一个数据库。我使用核心数据。我需要使用来自服务器的信息刷新我的本地数据库。我想减少更新数据库的时间。假设我有一个包含 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
我没有更改名称内容,但我更改了名称值。如果我保存上下文,它会重写数据库吗?这个问题的目的是了解如何有效地使用核心数据。我应该编写自定义属性来比较字符串的内容,还是应该将大数据存储在不同的表中?感谢您到目前为止的阅读,很抱歉过于冗长。