【问题标题】:Update Core Data records <fault>更新核心数据记录 <故障>
【发布时间】:2011-09-07 04:30:02
【问题描述】:

我正在尝试更新 Core Data 中的一些记录。我正在采取以下步骤来完成它

  1. 带有谓词的 Fetch 函数从核心数据中检索记录
  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]

  }
}

【问题讨论】:

    标签: ios core-data predicate nsfetchrequest


    【解决方案1】:

    您在日志中看到的fault 并不表示错误,而是表示托管对象未完全加载到内存中,而是represented by a fault object。这是正常行为。当您尝试访问或更改对象属性时,整个对象将“出错”或读入内存。这是一个令人困惑的老式数据库术语,可以追溯到 1960 年代。

    您的代码不保存任何对象。直到您在托管对象上下文上调用 save 之前,对内存中托管对象的更改不会被持久化。

    您也不希望像这样使用可变副本:

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

    ... 因为它浪费内存并可能导致重复的托管对象。 Apple docs 中有一些代码可以启动它,但它是错误的。相反,只需使用:

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

    ...这将返回一个自动释放的与 fetch 匹配的托管对象数组。

    【讨论】:

    • 感谢 TechZen 如果我将 fetchResults 存储在 Array 中并对 Array 进行更改然后调用 save 会将数据存储在核心数据中吗?
    • 是的,这是托管对象的“托管”部分。对上下文的提取返回由上下文管理的对象,并且上下文保存对对象的所有更改。
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2010-12-22
    • 1970-01-01
    • 2012-07-02
    • 2023-03-27
    相关资源
    最近更新 更多