我有一個核心數據後端顯示出一些奇怪的行爲。我第一次運行我的應用程序(在模擬器中),我的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個以前的條目,但它應該已經看到了第一個,當它試圖插入第二。
是的,這是我的問題,我想這是事做線程這樣的,但不確定如何解決它。另外,爲了避免編譯器的抱怨,我必須在塊中聲明和實例化一個新的NSError變量,如下所示:'NSError * blockError = Nil;'(我試圖將此作爲編輯添加到您的文章中,但它被拒絕:-() – Nick 2013-05-07 20:52:50
不需要額外的'error'對象,只需聲明你擁有的那個'__block NSError * error = nil;'。很樂意幫助 – 2013-05-08 04:46:28
是的,我試着將它設置爲Nil,並且它工作正常太...但我寧願記錄錯誤,以防萬一出現問題。 – Nick 2013-05-08 08:42:58