2011-09-07 50 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