iPhone Как изменить данные, содержащиеся в постоянном хранилище, используя Core Data - PullRequest
1 голос
/ 27 февраля 2010

Я застрял, пытаясь выяснить, как изменить данные, содержащиеся в постоянном хранилище. Я пишу приложение с несколькими представлениями, используя UITabBarController, мои основные методы данных расположены в основном на основном делегате приложения, но я буду использовать эти данные только из представления UItableViewController.

Чтобы использовать managedObjectContext, созданный в основном делегате приложения из UITableViewController, я использую следующее для метода viewDidLoad::

MessageAppDelegate *appDelegate = (MessageAppDelegate *)[[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];

Затем приложение отображает некоторые сообщения в таблице, и когда пользователь выбирает UITableViewCell (didSelectRowAtIndexPath), я получаю идентификатор объекта сообщения и вызываю следующий метод:

[self readMessage:pk];
-(void)readMessage:(NSInteger)pk {  
// First I select the data
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// had to setReturnsObjectsAsFaults to NO so I could access the message data
[request setReturnsObjectsAsFaults:NO];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pk == %d", pk];
[request setPredicate:predicate];

NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:request error:&error];
[request release];

// Then I update the object
for (Message *thisMessage in items) {
    //I display the message to the console before updating to check the value
    DLog(@"before reading message %@", thisMessage);
    // we set the message flat to YES
    [thisMessage setRead:YES];
    // we set some sample text here (just for testing)
    [thisMessage setMessageText:@"New message text"];
    // I then display the message to the console checking that the flag and text has been updated
    DLog(@"read message %@", thisMessage);
}

// Finally I save the updated message calling the function posted below
[self saveMOC];
}

- (void)saveMOC {
 NSError *error;
 if (![managedObjectContext save:&error]) {
  NSLog(@"there was an error saving the message!");
 }
}

После этого данные обновляются корректно, и если я извлекаю данные из управляемогоObjectContext после сохранения, я получаю правильные значения. Я подтвердил это, добавив следующий код в конце метода readMessage:

    request = [[NSFetchRequest alloc] init];
//required to avoid presenting objects as faults!!
[request setReturnsObjectsAsFaults:NO];
entity = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity];


//Set the sort descriptor
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"pk" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];

//Execute the request
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
    // Handle the error later
    DLog(@"ERROR: Unable to fetch the results");
}

[self setMessagesArray:mutableFetchResults];
    NSLog(@"Data now is: %@", mutableFetchResults);
[mutableFetchResults release];
[request release];

Проблема в том, что, если я выйду из приложения и запустлю его снова, все мои сообщения потеряют свойство read (или любые другие сделанные мной изменения), и просмотр таблицы загрузит данные, как они были впервые сохранены в постоянном хранилище. *

Ответы [ 2 ]

0 голосов
/ 23 марта 2010

-readMessage: метод, определенный в вашем делегате приложения или в вашем контроллере представления? Я предполагаю, что вы изменяете свойства объекта в другом контексте управляемого объекта, чем тот, в котором вы пытаетесь сохранить изменения (MOC в делегате приложения), который на самом деле не имеет представления о том, что что-то изменилось. С другой стороны, MOC, который хранит ваши изменения, никогда не сохраняется (изменения сохраняются только в памяти), и эти изменения теряются после перезапуска приложения.

Может ли быть такая ситуация?

0 голосов
/ 28 февраля 2010

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

- (void)saveMOC {
 NSError *error;
 if (![managedObjectContext save:&error]) {
  NSLog(@"there was an error saving the message!");
 } else {
  NSLog(@"The message was saved!");
 }
}

Так что для каждого успешного вызова saveMOC вы должны увидеть консольное сообщение. Если он вызывается и вы видите сообщения, то вы не должны изменять свойство 'read message'. Вы можете проверить это, проверив значение свойства 'read message' до и после его установки либо с помощью точки останова, либо с помощью сообщений NSLog для вывода значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...