Обновление записей базовых данных <fault> - PullRequest
0 голосов
/ 07 сентября 2011

Я пытаюсь обновить некоторые записи в Core Data.Я выполняю следующие шаги, чтобы сделать это

  1. Функция Fetch с предикатом извлекает записи из базовых данных
  2. Сохраняет набор результатов в массиве объектов
  3. Loopsчерез массив и обновлять каждую запись
  4. Контекст сохранения вызова

У меня две проблемы

  • После начального запуска я получаю вlog
  • Я не уверен, что контекст сохранения действительно сохранит объект

Мой код:

- (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]

  }
}

1 Ответ

2 голосов
/ 07 сентября 2011

fault, который вы видите в журнале, не указывает на ошибку, но означает, что управляемый объект не полностью загружен в память, а вместо этого представлен объектом сбоя . Это нормальное поведение. Когда вы пытаетесь получить доступ или изменить атрибут объекта, полный объект будет "поврежден" или будет считан в память. Это вводящая в заблуждение терминология баз данных старой моды, восходящая к 1960-м годам.

Ваш код не сохраняет никаких объектов. Изменения в управляемых объектах в памяти не будут сохраняться до тех пор, пока вы не вызовете save в контексте управляемого объекта.

Вы также не хотите использовать изменяемую копию, например:

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

… потому что это тратит память и может привести к дублированию управляемых объектов. Был некоторый код в документах Apple, который начал это, но это ошибочно. Вместо этого просто используйте:

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

… который вернет автоматически освобожденный массив управляемых объектов, соответствующих выборке.

...