2012-01-05 105 views
1

我正在开发一个note-app,并且在核心数据方面遇到了一些麻烦。我遇到的问题是,在我的NSManagedObject对象的属性(的NSString)没有得到应用已经终止后更新。场景:(1)Build &运行应用程序,(2)写一些东西(UITextView),(3)按主页按钮(背景),(5)终止应用程序,(6)打开应用程序,文本在那里,( 7)编辑文本(或删除文本),(8)按Home键,(9)终止应用程序,(10)再次打开该应用程序和新的文本是不存在的。无法更新iOS NSManagedObject属性

我想我已经本地化错误此代码段/方法:

// 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; 
} 

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

更新:小的澄清,它似乎是“页面文本”对象只能写一次,即我只能做“可保存”的变化,当我第一次创建它。

回答

1

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

  1. 确实,当你点击home键的textViewDidEndEditing被称为?
  2. 我怀疑下面的方法做你想要什么。

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

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

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

+0

1.是,否。当我点击完成按钮时它会被保存,想把它移动到“textViewDidChange”,但它仍然可以工作。 2.这是一个很好的观点,但我在创建页面方法中使用NSlog尝试插入代码,并且只在需要时调用它。 – Anders 2012-01-05 15:50:38

+0

在这个失去了一些头发。像往常一样是一个愚蠢的错误。在我的自定义NSManagedObject中,当它应该是'@ dynamic'时,我实现了文本属性'@ syntezise'。无论如何感谢@Canopus和@gamBit – Anders 2012-01-05 19:24:48

2

嗯它看起来不像你曾经调用保存在你的NSManagedObjectContext,你的对象仍然出现后,你终止应用程序?他们正在拯救?

类似的东西这个应该你插入后工作,并删除:

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

self.context是无论你的NSManagedObjectContext是。

+0

嗨,我保存在我的应用程序委托/控制器,在appWillResignActive和appWillTerminate(或他们被称为(现在不是家))。我是否需要保存在我的其他视图控制器吗?这个问题只发生在文本视图中,该应用程序还支持“绘图”,它应该保存/更新。所以我怀疑这个问题与保存其他事情有关。 – Anders 2012-01-05 13:30:33