我正在开发一个笔记本应用程序,我在使用核心数据方面遇到了一些麻烦。我遇到的问题是我的NSManagedObject对象属性(NSString)在应用程序终止后不会更新。场景:(1)构建&运行应用程序,(2)写一些东西(UITextView),(3)按主页按钮(背景),(5)终止应用程序,(6)打开应用程序,文本在那里,(7)编辑文本(或删除文本),(8)按主页按钮,(9)终止应用程序,(10)再次打开应用程序,新文本不存在。
我认为我已将错误本地化为此代码段/方法:
// Helper method to change page, it takes one argument, tag of the next/prevoius page.
// This method is called in viewWillAppear.
- (void)goToPage:(int)tag
{
// Set up the new current page.
currentPage = [pageList objectAtIndex:tag];
NSLog(@"%@", currentPage.pageText); // Returns the old value, not the updated.
if ([currentPage.inputType isEqualToString:@"drawing"]) {
[pageView changeToDrawing];
toolSegment.selectedSegmentIndex = 0;
UIImage * pageImage = [UIImage imageWithData:currentPage.pageImage];
pageView.canvas.image = pageImage;
} else if ([currentPage.inputType isEqualToString:@"text"]) {
[pageView changeToText];
toolSegment.selectedSegmentIndex = 1;
pageView.pageText.text = currentPage.pageText;
if (editing) {
[undoButton removeFromSuperview];
[redoButton removeFromSuperview];
}
}
[self updateMenu];
}
当我运行NSLog(@"%@", currentPage.pageText);
时,它显示该值尚未更新/保存。
我设置的值如下:
- (void)textViewDidEndEditing:(UITextView *)textView
{
currentPage.pageText = textView.text;
}
我最初设置当前页面如下:
// Sets the current page to the last open page
currentPageTag = pagesNoteblock.lastOpenPage;
currentPage = [pageList objectAtIndex:currentPageTag];
并创建这样的新页面:
NSString * currentInputType;
if (currentPage.inputType == @"drawing") {
currentInputType = @"drawing";
} else if ([currentPage.inputType isEqualToString:@"text"]) {
currentInputType = @"text";
}
// Sets the current page.
Page * newPage = [NSEntityDescription insertNewObjectForEntityForName:@"Page" inManagedObjectContext:moc];
newPage.createdAt = [NSDate date];
newPage.inputType = currentInputType;
// Adds the new page to the database and to the pageList array.
[pagesNoteblock addNoteblockPagesObject:newPage];
[pageList addObject:newPage];
// Sets the current page and clears the textView.
currentPage = [pageList objectAtIndex:currentPageTag];
我还有一个应该保存页面内容的辅助方法,这在viewWillDisapears和其他一些地方调用:
// Method that saves the current page's image to the database.
- (void)savePageContent
{
// Saves the image to the database.
if ([currentPage.inputType isEqualToString:@"text"]) {
currentPage.pageText = pageView.pageText.text;
} else if ([currentPage.inputType isEqualToString:@"drawing"]) {
NSData * coreDataImage = [NSData dataWithData:UIImagePNGRepresentation(pageView.canvas.image)];
currentPage.pageImage = coreDataImage;
}
pagesNoteblock.lastOpenPage = currentPageTag;
}
任何帮助/提示都将不胜感激!
更新:小澄清,似乎“页面文本”对象只能写一次,即我只能在第一次创建它时对其进行“可修改”的更改。
答案 0 :(得分:2)
嗯,看起来你没有在你的NSManagedObjectContext上调用save,你终止应用程序后仍然会出现你的对象吗?他们在救?
在插入和删除后,与此类似的内容应该有效:
NSError *error;
[self.context save:&error];
self.context
是你的NSManagedObjectContext。
答案 1 :(得分:1)
我有两个想法,但不太确定:
textViewDidEndEditing
吗?我怀疑以下方法正在做你想做的事。
Page * newPage = [NSEntityDescription insertNewObjectForEntityForName:@“Page”inManagedObjectContext:moc];
此方法为Page Class插入(或创建)新的实例/记录。它不会更新任何已经存在的记录!我没有看到你获取请求,但是当你从数据库中获取时,你得到一个数组,我假设你只显示第一个(atIndex:0)。
换句话说,您正在保存它,但作为数据库列表末尾的新记录。您没有更新已经显示的那个。