关于Core Data何时commit的提问

2012-08-29 19:59:11 +08:00
 iYu
这两天看core data。然后试着做。出现下列问题。就是我insert进去一个数据。core data并没有马上提交到数据库里面。类似缓存了一下。然后 大概过15秒才commit。这时候 如果我退出app。那数据就丢失了。
找了一下,并没有找到解决方法。
类似这样
http://stackoverflow.com/questions/11795391/core-data-commit-notification

请问大家是怎么解决这个问题的。我使用的是斯坦福老头的UIManagedDocument方法。并没有直接Sqlite。
3579 次点击
所在节点    iDev
7 条回复
jjgod
2012-08-29 20:11:55 +08:00
你为啥不直接调用 NSManagedObjectContext 的 -save:?
iYu
2012-08-29 20:12:31 +08:00
@jjgod save了一样等15秒
jjgod
2012-08-29 20:14:48 +08:00
在 Mac OS X 下是即时的,不知道 iOS 玩了什么花样。
iYu
2012-08-29 20:17:40 +08:00



@jjgod 贴两张图。
iYu
2012-08-29 21:36:39 +08:00
无耻的最后顶一次
everbird
2012-08-30 10:15:13 +08:00
线索一:http://stackoverflow.com/questions/9789697/why-does-ios-delay-when-saving-core-data-via-a-uimanageddocument
线索二:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/Articles/cdTroubleshooting.html 的Problems with Saving部分第一条SQLite store takes a "long time" to save

只是“不知google之”的结果,未实践,仅供参考
iYu
2012-08-30 13:24:24 +08:00
@everbird
@jjgod 昨天弄了一晚上。。首先发现是我测试的问题。因为我是insert以后 就直接Cmd-R来重新运行程序。所以,不是正常退出程序。发现这个问题以后。

目前 解决方法
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
[self saveContext];
}
- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
[self saveContext];
}


- (void)saveContext
{

OMPCoreDataManager *dataManager = [OMPCoreDataManager shareOMPCoreDataManager];
NSManagedObjectContext *managedObjectContext = dataManager.ompDatabase.managedObjectContext;
if (managedObjectContext != nil) {
[managedObjectContext performBlock:^{
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}];

}
}
用了类似这样的解决方法。看stackoverflow上说并不能保证100%的正确性。不够我测试了一下真机上 应该没有问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/46438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX