Не удается обновить свойство iOS NSManagedObject - PullRequest
1 голос
/ 05 января 2012

Я работаю над приложением для заметок, и у меня возникли проблемы с основными данными.У меня проблема в том, что одно из свойств объекта 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;
}

I Первоначально устанавливаю текущую страницу следующим образом:

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

Любая помощь / советы приветствуются!

Обновление: небольшое пояснение, кажется, что объект "Page-text" доступен для записи только один раз, то есть я могу вносить в него только "сохраняемые" изменения при первом его создании.

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Хммм, не похоже, что вы когда-либо вызывали save для своего NSManagedObjectContext, ваши объекты все еще появляются после того, как вы закрываете приложение?Они экономят?

Что-то похожее на это должно работать после вставки и удаления:

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

self.context, каким бы ни был ваш NSManagedObjectContext.

1 голос
/ 05 января 2012

У меня есть две идеи, но я не совсем уверен:

  1. Вы уверены, что когда вы нажмете кнопку Home, будет вызван textViewDidEndEditing?
  2. Я подозреваю, что следующий метод делает то, что вы хотите.

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

Этот метод вставляет (или создает) новый экземпляр / запись для Page Class. Он не обновляет записи, которые уже существуют! Я не вижу, как вы получаете запрос, но когда вы выбираете из своей базы данных, вы получаете массив, и я предполагаю, что вы отображаете только первый (atIndex: 0).

Другими словами, вы сохраняете его, но как новую запись в конце списка вашей базы данных. Вы не обновляете тот, который уже отображается.

...