我的应用中有一个表单,允许用户输入文本并将其保存到CoreData
中的UIManagedDocument
。
当应用程序正在运行时,我使用NSManagedObjectContext
作为从该文档插入和提取对象的唯一上下文。
我遇到的问题是 - 在保存之前我检查重复项,如果我在等待 10 秒后进行后续插入,则context
不会确认已插入({{ 1}}返回0)对象,并允许重复。
如果另一方面我等待它 - 结果是预期的([matches count]
返回任何数字都是真的)。
[matches count]
答案 0 :(得分:1)
代码看起来像这样:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"EntityName"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueID == %@", newID]
[request setPredicate:predicate];
NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];
if([matches count]){
// update record
SomeEnt *ent = [matches objectAtIndex:0];
// ent set properties
}
else{
// add new record
SomeEnt *ent = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:context];
// ent set properties
// ...
}
NSError *error;
[context save:&error];
答案 1 :(得分:0)
我认为您应该致电[context save:&error]
将修改保存到商店。
或者添加[request includesPendingChanges:YES]
以允许对待处理的未保存更改进行请求。
答案 2 :(得分:0)
查询中的某些内容没有意义。您按uniqueID排序,但只获取一个ID,那么排序是什么?消除它。
此外,在保存之前检查uniqueID 是没有意义的。您应该在创建新对象之前检查。
此查询应该非常快,并且根本不会干扰您的插入。考虑将fetchLimit
设置为1,但这不是必需的。
NSArray *results = [self.managedObjectContext
executeFetchRequest:request error:nil];
EntityName *object;
if (results.count) {
object = results.lastObject;
}
else {
object = [NSEntityDescription insertNewObject… ];
}