更改Core Data获取的数组

时间:2012-03-04 16:51:45

标签: objective-c core-data

这就是我所拥有的:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"NoteObject" inManagedObjectContext:appDelegate.managedObjectContext];

[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(parentNoteId == %@) AND (noteId!=rootNoteId)", appDelegate.currentNoteId];
[fetchRequest setPredicate:predicate];
NSError *error;

[appDelegate.arrayOfNotes setArray:[appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error]];

NoteObject *note=[appDelegate.arrayOfNotes objectAtIndex:0];
[note.arrayOfTags addObject:someObject];

NSManagedObjectContext *context = [appDelegate managedObjectContext];
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

fetch工作正常,向arrayOfTags添加对象可以正常工作并在UI中反映出来。但是,当我退出应用程序并返回时,arrayOfTags缺少我添加的那个(但它有另外两个,所以我知道数组工作正常)。由于某种原因,它不能保存。

NoteObjectNSManagedObject的子类,arrayOfTags是实体的可转换属性。)

我在这里做错了吗?

编辑:这是我添加新笔记的方法,即使使用arrayOfTags也可以保存得很好,当我退出应用程序并重新登录时,所有内容都会保存。

NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *noteEntity = [[appDelegate.managedObjectModel entitiesByName] objectForKey:@"NoteObject"];
NoteObject *tempNote = [[NoteObject alloc] initWithEntity:noteEntity insertIntoManagedObjectContext:context];
[tempNote.arrayOfTags addObject:@"tag1"];
NSError *error;
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        }

只有当我进行更改时才能正确保存..

2 个答案:

答案 0 :(得分:0)

您的意思是说您正在使用Transformable属性吗? 这有用吗: Core Data saving problem: can't update transformable attribute (NSArray)

答案 1 :(得分:0)

事实证明,我必须做的就是在对数组进行更改后重新设置数组:

NoteObject *tempNote = [[NoteObject alloc] initWithEntity:noteEntity insertIntoManagedObjectContext:context];
[tempNote.arrayOfTags addObject:@"tag1"];

[tempNote setArrayOfTags:tempNote.arrayOfTags]; //this is the magic line

NSError *error;
if (![context save:&error]) {
       NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}