2013-05-05 67 views
1

我有一個核心數據後端顯示出一些奇怪的行爲。我第一次運行我的應用程序(在模擬器中),我的NSFetchRequest將永遠不會找到匹配,即使連續多次給予相同的項目(它會返回'沒有結果',每個請求然後繼續插入重複信息到數據庫 - 我可以看到發生,因爲我有一個tableview綁定到數據庫)。核心數據:NSManagedObjectContext未保存/獲取請求失敗,直到應用程序退出並重新啓動

如果我通過按主頁按鈕「退出」應用程序,然後重新打開應用程序。它開始按預期運行(在適當的情況下返回結果)。我也可以刪除應用程序,然後從Xcode再次運行它,以重置此過程回到開始。它似乎不保存數據庫,直到應用程序關閉,即使我調用保存NSManagedObjectContext(這是返回true)。

這是怎麼回事嗎?我如何按預期完成這項工作?我想我只是沒有保存我對NSManagedObjectContext的更改,但我該怎麼做?

下面是其獲取功能/返回對象從我的NSManagedObjectContext的:

+ (Mark *)markWithTWLInfo:(NSDictionary *)markDictionary 
    inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    Mark *mark = nil; 

    NSLog(@"Starting Operation for Key: %@", [markDictionary[JS_MARK_ID] description]); 

    // Build a fetch request to see if we can find this Mark in the database. 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Mark"]; 
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]]; 
    request.predicate = [NSPredicate predicateWithFormat:@"idUnique = %@", [markDictionary[JS_MARK_ID] description]]; 

    // Execute the fetch 

    NSError *error = nil; 
    NSArray *matches = [context executeFetchRequest:request error:&error]; 

    // Check what happened in the fetch 

    if (!matches || ([matches count] > 1) || error) { // nil means fetch failed; more than one impossible (unique!) 
     // handle error 
     if (error) { 
      NSLog(@"Fetch error: %@", [error description]); 
     } else { 
      NSLog(@"Found No/Multiple matches for key: %@", [markDictionary[JS_MARK_ID] description]); 
     } 
    } else if (![matches count]) { // none found, so let's create a mark 

     NSLog(@"Inserting: %@", [markDictionary[JS_MARK_ID] description]); 

     mark = [NSEntityDescription insertNewObjectForEntityForName:@"Mark" inManagedObjectContext:context]; 
     mark.idUnique = [NSNumber numberWithInt:[markDictionary[JS_MARK_ID] intValue]]; 

     //Save the changes; this returns True 
     if ([context save:&error]) { 
      NSLog(@"Saved is true"); 
     } else { 
      NSLog(@"Saved is false"); 
     } 

     if (error) { 
      NSLog(@"Save error: %@", [error description]); 
     } 
    } else { // found the mark, just return it from the list of matches (which there will only be one of) 
     NSLog(@"Found existing object for key: %@", [markDictionary[JS_MARK_ID] description]); 
     mark = [matches lastObject]; 
    } 
    return mark; 
} 

我調用這個函數像這樣的,我想插入每一個關口:

for (NSDictionary *mark in results) { 
    if (DEMO_LOGGING) NSLog(@"Inserting: %@",[mark objectForKey:@"Mark"]); 
    [self.managedObjectContext performBlock:^{ 
     [Mark markWithTWLInfo:[mark objectForKey:@"Mark"] inManagedObjectContext:self.managedObjectContext]; 
    }]; 
} 

這裏是我所看到的在日誌中遇到這個問題時:

- 用新的數據庫啓動應用程序:

2013-05-05 16:45:08.105 ToWatchList[10155:c07] Starting Operation for Key: 731 
2013-05-05 16:45:08.106 ToWatchList[10155:c07] Inserting: 731 
2013-05-05 16:45:08.111 ToWatchList[10155:c07] Saved is true 
2013-05-05 16:45:10.651 ToWatchList[10155:c07] Starting Operation for Key: 731 
2013-05-05 16:45:10.652 ToWatchList[10155:c07] Inserting: 731 
2013-05-05 16:45:10.654 ToWatchList[10155:c07] Saved is true 

-QUIT並重新啓動該程序在這裏

2013-05-05 16:45:29.816 ToWatchList[10155:c07] Starting Operation for Key: 731 
2013-05-05 16:45:29.817 ToWatchList[10155:c07] Found No/Multiple matches for key: 731 

- 現在NSFetchRequest預期返回我的2個以前的條目,但它應該已經看到了第一個,當它試圖插入第二。

回答

4

我的猜測是,你有一個父上下文self.managedObjectContext

如果是這種情況,爲了確保財產的唯一性,您必須一直保存到商店(遞歸保存直到沒有parentContext存在)。

請注意,在確保唯一性之前,您必須等待所有父上下文的保存完成。

取代你[context save:&error]有:

NSManagedObjectContext* c = context; 
__block BOOL success = YES; 
while (c && success) { 
    [c performBlockAndWait:^{ 
     success = [c save:&error]; 
     //handle save success/failure 
    }]; 
    c = c.parentContext; 
} 
+0

是的,這是我的問題,我想這是事做線程這樣的,但不確定如何解決它。另外,爲了避免編譯器的抱怨,我必須在塊中聲明和實例化一個新的NSError變量,如下所示:'NSError * blockError = Nil;'(我試圖將此作爲編輯添加到您的文章中,但它被拒絕:-() – Nick 2013-05-07 20:52:50

+0

不需要額外的'error'對象,只需聲明你擁有的那個'__block NSError * error = nil;'。很樂意幫助 – 2013-05-08 04:46:28

+0

是的,我試着將它設置爲Nil,並且它工作正常太...但我寧願記錄錯誤,以防萬一出現問題。 – Nick 2013-05-08 08:42:58

相關問題