在不调用当前 NSManagedObjectContext (核心数据)的情况下检查 iOS 中的数据库是不是为空?
Posted
技术标签:
【中文标题】在不调用当前 NSManagedObjectContext (核心数据)的情况下检查 iOS 中的数据库是不是为空?【英文标题】:Check if database is empty in iOS without of calling current NSManagedObjectContext (Core Data)?在不调用当前 NSManagedObjectContext (核心数据)的情况下检查 iOS 中的数据库是否为空? 【发布时间】:2014-07-17 11:39:11 【问题描述】:My question is similar to the following one but has differences
我使用核心数据。问题是如果我使用当前的NSManagedObjectContext
,那么我可能会得到不正确的结果。例如:
数据库从一开始就被填满。
我的应用通过当前上下文删除所有实体。
我检查数据库是否已填充并获得 NO
但实际上数据库仍已填充,因为应保存上下文以应用更改。
我的解决方案示例:
- (BOOL)isDBFilled
//separate context to
NSManagedObjectContext *context = [[[NSManagedObjectContext alloc] init] autorelease];
[context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
[context setPersistentStoreCoordinator:coordinator];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:... inManagedObjectContext:context];
[request setEntity:entity];
[request setFetchLimit:1];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
if (!results)
LOG(@"Fetch error: %@", error);
abort();
if ([results count] == 0)
return NO;
return YES;
那么创建另一个上下文只是为了检查数据库是否已填满是正常和安全的吗?或者除了创建一个单独的BOOL
变量之外,是否有更好的方法来执行此检查,该变量将在 db 更改之前和之后更改?
【问题讨论】:
【参考方案1】:可以使用单独的上下文来检查数据库是否已填充。开销很小,所以我不会反对。
请注意,Apple 不一定同意。来自“核心数据片段”:
视图控制器也不应该为自己创建上下文(除非它是嵌套上下文)。
话虽如此,我认为没有必要这样做。如果删除所有实体,保存然后检查应该得到一个空数据库。如果您删除所有实体并且不保存然后检查,您应该得到一个非空数据库。您可以在一个上下文中轻松且更轻松地做到这一点。
PS:autorelease
似乎表明您使用的是非常旧的 SDK。升级怎么样?
【讨论】:
autorelease
并不意味着旧的 sdk。这意味着 ARC 被手动禁用。而且我不同意您两次保存上下文的建议:1)我不能总是确定何时要检查 db 是否已填充; 2)上下文保存需要足够长的时间,所以应该尽可能少地调用它
您混淆了所有记录的删除和保存 - 这可能需要很长时间 - 以及数据库的检查(应该几乎没有时间)。我无法确定何时要检查,您的应用程序逻辑存在一些缺陷。 (另外,这将是另一个问题。)我的回答是:您可以使用单独的上下文,但不应该。
这不是缺陷。这是因为客户需求的变化。以上是关于在不调用当前 NSManagedObjectContext (核心数据)的情况下检查 iOS 中的数据库是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章
为什么glDrawElments()在不使用任何着色器的情况下工作?