2011-03-08 47 views
9

我有一个iPhone应用程序在保存CoreData时有时会冻结,然后不会重新启动。我确实有第二个线程使用数据库,但我认为我已经按照该模式为该线程创建了单独的上下文。这是重新启动的崩溃报告。有任何想法吗?在CoreData上冻结应用程序保存

我试过改变它只能运行一个线程,这里是进入背景后的最新冰点。

#0 0x30851b98 in fsync 
#1 0x3094e694 in _sqlite3_purgeEligiblePagerCacheMemory 
#2 0x3094e6b8 in _sqlite3_purgeEligiblePagerCacheMemory 
#3 0x30945372 in sqlite3_compileoption_get 
#4 0x30957f06 in sqlite3_extended_errcode 
#5 0x3095dc20 in sqlite3_extended_errcode 
#6 0x3095dd8e in sqlite3_extended_errcode 
#7 0x309646f8 in sqlite3_clear_bindings 
#8 0x3098845a in sqlite3_open16 
#9 0x3094495a in sqlite3_step 
#10 0x31a1dc20 in _execute 
#11 0x31acc6e8 in -[NSSQLiteConnection commitTransaction] 
#12 0x31aca646 in -[NSSQLiteConnection endPrimaryKeyGeneration] 
#13 0x31abeab4 in -[NSSQLCore prepareForSave:] 
#14 0x31a4acd0 in -[NSSQLCore saveChanges:] 
#15 0x31a1591e in -[NSSQLCore executeRequest:withContext:error:] 
#16 0x31a1538a in -[NSPersistentStoreCoordinator executeRequest:withContext:error:] 
#17 0x31a48544 in -[NSManagedObjectContext save:] 
#18 0x000080aa in -[KPersistence saveManagedObjects:] at KPersistence.m:242 
#19 0x00004320 in -[KinKastAppDelegate applicationDidEnterBackground:] at KinKastAppDelegate.m:126 

这是我实现saveManagedObjects的

-(BOOL)saveManagedObjects:(NSError **)error 
{ 
    [persistentStoreCoordinator lock]; 
    BOOL success = YES; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:error]) { 
      VLog(@"Unresolved error %@, %@", *error, [*error userInfo]); 
      success = NO; 
     } 
    } 
    [persistentStoreCoordinator unlock]; 
    return success; 
} 
+0

+1同样的问题,没有解决方案。 – 2012-02-01 18:24:39

+0

我已经为我解决了它。问题是将浮点数或双精度值保存到整数字段。这导致了内存中的浮点nsnumber和始终从磁盘上的db读取的整数nsnumber之间的无限合并循环。 – 2012-02-01 19:41:17

+0

嗯..感谢提示。我将不得不再次检查我的代码,看起来需要一段时间:S – 2012-02-01 20:18:53

回答

2

所以现在我相信问题在于我有时会将浮点值的NSNumber写入整数字段。这导致内存中的副本与从数据库读取的副本不同,并且这导致了无限的合并循环。但是,如果你重新启动应用程序,它工作得很好,因为从那时起,该值只是一个整数。

13

当从多个线程使用的核心数据,确保保存操作之前锁定您的PSC:

[self.persistentStoreCoordinator lock]; 
NSManagedObjectContext *context = //your context; 
[context save:&error]; 
if (error) { 
    // handle error 
} 
[self.persistentStoreCoordinator unlock]; 
+0

谢谢,实际上我没有做这个锁,但它似乎并没有完全解决。 – 2011-03-08 22:44:26

+0

张贴您的保存操作的代码,然后 – amattn 2011-03-09 00:39:36

+0

我试着改变它只是在一个线程上运行,我仍然得到同样的问题 – 2011-03-09 02:56:09