2012-11-12 41 views
2

我使用的核心數據,來節省一些整數(率),然後我打電話保存在上下文:核心數據不保存我的數據

HeartRateBeat * beat = [HeartRateBeat heartRateWithHeartRate:rate 
          ofRecordTitle:self.recordTitle 
        inManagedObjectContext:document.managedObjectContext]; 

NSError * error; 
[document.managedObjectContext save:&error]; 

內部的方便的方法創建使用NSEntityDescription這樣的對象:

heartRateBeat = [NSEntityDescription insertNewObjectForEntityForName:@"HeartRateBeat" inManagedObjectContext:context]; 

(我只是複製了一些重要的代碼,只是爲了證明我做了什麼。)

我立刻執行獲取每一個心臟跳動插入之後請求和管理對象C ontext保存(我立即保存),並且請求顯示心跳似乎存儲在覈心數據內(心跳數越來越多),但是如果我重新啓動我的應用程序(我正在使用模擬器BTW),我知道事情並不是實際上因爲重新開始而被保存到磁盤。用SQLite3命令行檢查顯示空表。我在這裏錯過了什麼?

回答

3

我得到同樣的問題,但我認爲它只是因爲,我認爲,像我一樣,你只是通過xcode停止應用程序,而不是實際關閉它。我使用這段代碼來強制寫入。我使用UIManagedDocument,通過appdelegate共享,而不是手動設置所有東西。

NSError *error = nil; 

if (![self.managedObjectContext save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

[[AppDelegate sharedAppDelegate].userDatabase saveToURL:[AppDelegate sharedAppDelegate].userDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil]; 
+0

是的,我總是剛剛退出模擬器。我在我插入的每一行上調用上面代碼的'[managedObjectContext save:]''。但是我沒有調用UIDocument的'forSaveOperation:completionHandler:'如果db中已經有東西,它不會寫所有東西嗎? – huggie

+0

事實證明這可行。謝謝。所以UidocumentSaveForOverwriting不會真的「覆蓋」? – huggie

+0

我還沒有遇到任何性能問題,但我的數據集不是「大」 –

0

我不知道你們,但是當我希望我的Core Data保存時,我的Core Data可以更好地保存。

這裏有一些代碼可以保存所有的核心數據。

-(void)forceSave { 
     NSManagedObjectContext * context = self.managedObjectContext; //Get your context here. 
    if (!context) { 
     NSLog(@"NO CONTEXT!"); 
     return; 
    } 

    NSError * error; 
    BOOL success = [context save:&error]; 
    if (error || !success) { 
     NSLog(@"success: %@ - error: %@", success ? @"true" : @"false", error); 
    } 

    [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:YES]; 
    [context performSelector:@selector(save:) withObject:nil afterDelay:1.0]; 
    [context setStalenessInterval:6.0]; 
    while (context) { 
     [context performBlock:^(){ 
      NSError * error; 
      bool success = [context save:&error]; 
      if (error || !success) 
       NSLog(@"success: %@ - error: %@", success ? @"true" : @"false", error); 

     }]; 
     context = context.parentContext; 
    } 

    NSLog(@"successful save!"); 

} 

請注意,這是壞代碼。除了其他問題之外,它不是線程安全的並且需要很長時間。但是,嘗試使用這個和刪除它的一些部分,以您的滿意:)