2013-08-07 32 views
0

我有一個存儲日期的CoreData實體Tracker。 該應用程序收到通知,並且CheckListViewController在CoreData中輸入數據長達13天,因此當CheckListViewController被取消時,CoreData實體Tracker將被填充13行。CoreData在向其中添加數據後被清空

MainViewController(其中駁回CheckListViewController),我有以下代碼:現在

- (void)dataSaved { 
     self.checkListVC dismissViewControllerAnimated:YES completion:^{ 
       // fetching all the data from 'Tracker' entity and doing NSLog on it 
       // all data gets logged in console without any issues 
     }]; 
    } 

,在我的代碼的某個地方後,我從實體Tracker獲取所有數據,但返回的數據爲空。 CoreData不顯示任何錯誤,它只是返回空數組。

編輯: 代碼從CoreData

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
[request setSortDescriptors:@[sortDescriptor]]; 
request.predicate = (fromDate && toDate) ? [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", fromDate, toDate] : nil; 

__block NSArray* fetchedHabits; 
[managedObjectContext performBlockAndWait:^{ 
    NSError *error = nil; 
    fetchedHabits = [managedObjectContext executeFetchRequest:request error:&error]; 

    if (error) NSLog(@"Unknown error occurred while fetching results from CoreData, %@ : %@", error, [error userInfo]); 
}]; 

CoreData模型獲取結果: enter image description here

更新1: 因此,大家可以看到有兩個實體,即HabitTracker。當我從Habit獲取結果時,它一切正常,但是當我嘗試從Tracker獲取結果時,它給了我一個空數組。我有一個共同的NSManagedObjectContext實例,因爲您可以使用單個managedObjectContext來管理多個CoreData實體。 我檢查了managedObjectContext.persistentStoreCoordinator.managedObjectModel.entitiesByName,它也列出了兩個實體。

更新2: 代碼,我在將數據添加到Tracker

TrackerCoreData *tracker = [NSEntityDescription insertNewObjectForEntityForName:ENTITY 
                    inManagedObjectContext:managedObjectContext]; 
tracker.date = date; 
tracker.habits = habits; 

// saving CoreData explicitly 
NSError *error = nil; 
[managedObjectContext save:&error]; 
+0

你可以顯示代碼如何在Coredata中保存對象。 – aahsanali

+0

添加提取碼 – nefarianblack

+0

很高興看到您用來保存對象的代碼。 – Firo

回答

0

可能有很多原因,如果您未能顯示記錄:

  • 數據沒有被保存
  • 數據未能正確檢索
  • 數據未顯示cor直接地

所有這些都可能是潛在的複雜情況,但您應該按照此順序檢查它們。

一個更好的方法:使用NSFetchedResultsController爲您的主視圖控制器,並讓委託方法負責更新您的表視圖。不需要讀取,也不需要在任何完成方法中完成工作 - 只需保存數據,FRC即可更新表格。

編輯:如何檢查物理數據庫
這可能是你的數據只存在於內存中,但實際上並沒有保存到數據庫中。從模擬器中找到實際的數據庫文件(在應用程序的文檔文件夾中),並使用命令行工具sqlite3或Firefox插件「SQLite Manager」進行檢查。

EDIT2:更具體的建議
您應該確保您撥打:

[managedObjectContext save:&error]; 

同時仔細檢查你的ENTITY宏代表(不是一個非常聰明的名稱)。

在我看來,你是過度使用塊方法沒有明顯的目的。首先嚐試使主線程(一個環境!)上的所有內容都可以工作。只有當你遇到性能問題時,考慮後臺線程和上下文,並調用performBlock等。

+0

1.數據已保存,因爲我已經告訴我正在顯示'dissmissViewControllerAnimated'中的數據。但後來,當我獲取數據時,它將返回空數據。 2.當我檢索數據時,我將謂詞設置爲'nil',以便可以獲取所有數據。但那是空的。 3.沒有點'不正確顯示',因爲我通過NSLog檢查數據,而不是通過任何tableView 此外,我需要數據繪製圖表,這就是爲什麼我不能使用NSFetchResultsController。 – nefarianblack

+0

檢查數據是否真正存在於coredata中的最佳方法是檢查數據庫本身。這可能是你的數據只有「TempData」 – Joshua

+0

如何去檢查數據庫本身? – nefarianblack

相關問題