无法更新iOS NSManagedObject属性

时间:2012-01-05 12:27:09

标签: objective-c ios core-data

我正在开发一个笔记本应用程序,我在使用核心数据方面遇到了一些麻烦。我遇到的问题是我的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;
}

任何帮助/提示都将不胜感激!

更新:小澄清,似乎“页面文本”对象只能写一次,即我只能在第一次创建它时对其进行“可修改”的更改。

2 个答案:

答案 0 :(得分:2)

嗯,看起来你没有在你的NSManagedObjectContext上调用save,你终止应用程序后仍然会出现你的对象吗?他们在救?

在插入和删除后,与此类似的内容应该有效:

NSError *error;
[self.context save:&error];

self.context是你的NSManagedObjectContext。

答案 1 :(得分:1)

我有两个想法,但不太确定:

  1. 您确定,当您按下主页按钮时,正在调用textViewDidEndEditing吗?
  2. 我怀疑以下方法正在做你想做的事。

    Page * newPage = [NSEntityDescription insertNewObjectForEntityForName:@“Page”inManagedObjectContext:moc];

  3. 此方法为Page Class插入(或创建)新的实例/记录。它不会更新任何已经存在的记录!我没有看到你获取请求,但是当你从数据库中获取时,你得到一个数组,我假设你只显示第一个(atIndex:0)。

    换句话说,您正在保存它,但作为数据库列表末尾的新记录。您没有更新已经显示的那个。