2013-02-28 75 views
3

三個問題,但它們都是相關的。如果你喜歡我可以把它們分成三個問題,這樣你可以獲得更多的學分。讓我知道你是否希望我這樣做。保存和刪除NSManagedObject&NSManagedObjectContext

我有下面的代碼,讓我訪問NSManagedObject

self.managedObjectContext = [(STAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

NSError *error; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntityDescription entityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext]]; 
NSArray *objectArray = [managedObjectContext executeFetchRequest:request error:&error]; 
if(objectArray.count==0){ 
    letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext]; 
    } else{ 
    letsMeet = (LetsMeet *)[objectArray objectAtIndex:0]; 
    } 

上面的代碼讓我來保存和檢索屬性。即我可以訪問letsMeet.attribute來保存和獲取。

問題1:如何刪除並啓動全新的managedObjectContext。即用戶具有他已經在場景之間填寫的表格。當用戶點擊導航控制器上的下一個按鈕時,所有內容都會從每個場景保存到CoreData。經過幾個屏幕之後,用戶想要取消該表單。在這一點上,我想刪除到目前爲止保存的所有內容。代碼示例請。

問題2:讓我們說用戶打開窗體的結尾並決定保存窗體供以後檢索。如何將整個表單的副本保存爲核心數據中的一個對象。代碼示例請。

問題3:我如何從Core Data稍後檢索保存的對象並顯示所有用戶保存的內容?代碼示例請。

回答

3
  1. 要刪除只是需要從NSManagedObjectContext刪除letsMeet對象。

    NSError *error;
    [managedObjectContext deleteObject:letsMeet];
    [managedObjectContext save:&error];

既然你永遠只有一個對象,得到的letsMeet參考是沒有問題的。你可以像你在代碼中那樣做。
更新: 而且您不需要刪除託管對象上下文。它只是一個空間來處理你的對象。問題最後的解釋。

2.如果LetsMeet實體的方式,所有的表單元素的LetsMeet屬性,當您保存managedObjectContext創建LetsMeet對象爲你的代碼做了藍本,這將被保存爲單個對象。

3.你已經知道如何檢索一個對象,就像你在代碼中做的那樣。一切都變得簡單,因爲你只使用一個對象。 在多個對象獲得唯一對象的情況下,您應該實現一個主鍵(可能是formID,即;將另一個屬性添加到LetsMeet),或者您應該知道每個對象的objectId,然後設置謂詞相應的提取請求。

NSFetchRequest *request = [[NSFetchRequest alloc]init]; 
[request setEntity:letsMeet]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"formId like %@", formId]; 
[request setPredicate:predicate]; 

NSArray *resultsArray =[managedObjectContext executeFetchRequest:request error:&error]; 

如果你的formId是唯一的,這將返回一個單一的對象數組。

但是,如果您僅使用核心數據處理一個對象,則可以使用NSUserDefaults或寫入plist文件來執行此操作。這有點矯枉過正。

更新: 要獲得NSManagedObject的OBJECTID:

[letsMeet objectId]; 

ManagedObjectContext就像一個白板。數組中的對象,託管對象上下文中的對象,它們都是相同的。您可以更改對象,添加對象,刪除對象等。只有當您執行寫入磁盤的[managedObjectContext save:]時,對象的當前狀態纔是。

+0

謝謝拉克什。它在這裏遲到了,我會在AM上演這一幕。在繼續構建應用程序時,我將添加更多對象。我會在上午通知你。順便說一句,我還沒有想出如何獲得objectID呢。 – user1107173 2013-02-28 04:59:06

+0

至於#3,我希望在完成時保存對象,並在基於Timestamp的UItableview中將它們拉起來。所以當你說我只有一個對象時,你的意思是managedObjectContext中的一個對象嗎?可能是我混淆了這兩個。當前對象將是用戶將在objectArray [0]上工作的對象。其他對象將是在用戶完成表單時將保存的對象,並顯示爲UItableview中的歷史記錄。我希望我有道理。謝謝。 – user1107173 2013-02-28 05:53:14

+0

您只能通過managedObjectContext訪問核心數據對象。在執行提取請求之後,resultArray [0]將是數組中唯一的對象,並且將是您要提取的對象。根據您的評論而不是formId/objectId,您將使用時間戳執行獲取。按日期設置謂詞看這裏http://stackoverflow.com/questions/1965331/nspredicate-filtering-objects-by-day-of-nsdate-property。 – Rakesh 2013-02-28 11:50:07

相關問題