【发布时间】:2010-02-27 19:45:44
【问题描述】:
我一直在试图弄清楚如何修改持久存储中包含的数据。
我正在使用UITabBarController 编写具有多个视图的应用程序,我的核心数据方法主要位于主应用程序委托上,但我只会使用来自UItableViewController 视图的这些数据。
为了使用UITableViewController 在主应用程序委托中创建的managedObjectContext,我在viewDidLoad: 方法上使用了以下内容:
MessageAppDelegate *appDelegate = (MessageAppDelegate *)[[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];
然后应用程序在表格中显示一些消息,当用户选择UITableViewCell (didSelectRowAtIndexPath) 时,我获取消息对象的 ID 并调用以下方法:
[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!");
}
}
之后数据得到正确更新,如果我在保存后从 managedObjectContext 获取数据,我会得到正确的值。
我通过在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];
问题是,如果我退出应用程序并再次启动它,我的所有消息都会丢失读取属性(或我所做的任何其他更改),并且 tableview 会加载数据,因为它首先保存到持久存储中。
【问题讨论】:
-
"我将"读取消息属性"设置为 TRUE ..." 这是您没有发布的一个代码块,但可能是最相关的。这段代码被调用了吗?您如何验证属性是否正在更新?
-
嗨 Joshua,我已经澄清了以上内容。谢谢!!
-
已解决:我在设置值之前错过了以下代码:[thisMessage willChangeValueForKey:@"read"]; [thisMessage setRead:YES]; [thisMessage didChangeValueForKey:@"read"];
标签: iphone objective-c core-data