2011-09-07 85 views
0

我試圖更新核心數據中的某些記錄。我米採用以下步驟來完成它更新核心數據記錄<fault>

  1. 獲取與謂詞函數從核心數據
  2. 將結果存儲在一個對象數組
  3. 遍歷數組設置檢索記錄並更新每個記錄
  4. 呼叫保存上下文

餘米運行到兩個問題

  • 初始運行後,我得到<故障>在日誌中
  • 我不能確定是否保存上下文將保存對象

我的代碼:

- (void)fetchExpenses {  
    // Define our table/entity to use 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:managedObjectContext]; 

    // Setup the fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    // Define how we will sort the records 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"publishTimestamp == nil"]; 
    [request setPredicate:predicate]; 


    // Fetch the records and handle an error 
    NSError *error; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

    if (!mutableFetchResults) { 
     // Handle the error. 
     // This is a serious error and should advise the user to restart the application 
    } 

    // Save our fetched data to an array 
    [self setExpenseArray: mutableFetchResults]; 
    [mutableFetchResults release]; 
    [request release]; 
} 

- (void) save: { 
[self fetchExpenses]; 
    int i = 1; 
    int max = [expenseArray count]; 

    for(i=1; i<=max; i++) { 
     // Get the expense selected. 
     Expense *expense = [expenseArray objectAtIndex: i]; 
     // Do your updates here 
     [expense setTimestamp:2] 

    } 
} 

回答

2

fault你看到在日誌中不表示錯誤,但意味着管理對象沒有完全加載到內存中,而是代替represented by a fault object。這是正常的行爲。當您嘗試訪問或更改對象屬性時,完整對象將「故障」或讀入內存。這是一個混亂的舊式數據庫術語,可以追溯到20世紀60年代。

您的代碼不保存任何對象。在調用託管對象上下文的save之前,對內存中託管對象的更改不會保留。

你也不想用一個可變的副本是這樣的:

NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

...因爲它浪費內存,並可能導致重複的管理對象。蘋果公司的文檔中有一些代碼已經啓動,但它的錯誤。相反,只需使用:

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

...它將返回與提取匹配的託管對象的自動釋放數組。

+0

Thanks TechZen如果我在Array中存儲fetchResults並對Array進行更改,然後調用save將它存儲在覈心數據中的數據? –

+0

是的,這是管理對象的「管理」部分。針對上下文的提取返回由上下文管理的對象,上下文保存對對象的所有更改。 – TechZen