2011-03-08 118 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