【问题标题】:Core Data removed objects reappearing on startupCore Data 移除的对象在启动时重新出现
【发布时间】:2011-04-25 18:16:23
【问题描述】:

我有一些核心数据条目,它们在应用程序启动时全部被提取并放入一个数组中。 当我使用deleteObject: 从Core Data 中删除一个对象时,我通过再次读取所有Core Data 条目来刷新这个数组并将它们放入数组中。在这里,Core Data 对象被正确删除并且没有加载到新数组中。但是当我再次启动应用程序时,条目不会被删除。它们再次加载。

有人知道为什么我的核心数据对象没有被正确删除吗?

这是我删除对象的地方:

// Define our table/entity to use  
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:managedObjectContext];

// Setup the fetch request  
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

// Fetch the records and handle an error  
NSError *error;  
NSMutableArray *allNotes = [[NSMutableArray alloc] initWithArray:[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]];

for(int i = 0; i < [allNotes count]; i++) {
    if([[allNotes objectAtIndex:i] identifier] == [[note objectAtIndex:0] identifier]) {
        [managedObjectContext deleteObject:[allNotes objectAtIndex:i]];
        NSLog(@"DELETING..");
        NSLog(@"%@", [allNotes objectAtIndex:i]);
    }
}

[request release];

这就是我在启动时设置核心数据条目数组的方式

// Define our table/entity to use  
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:managedObjectContext_];

    // Setup the fetch request  
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    // Fetch the records and handle an error  
    NSError *error;  
    globalNotes = [[NSMutableArray alloc] initWithArray:[[managedObjectContext_ executeFetchRequest:request error:&error] mutableCopy]];

    [request release];

    NSLog(@"NOTES ON STARTUP");
    NSLog(@"%@", globalNotes);

这是我使用NSLog 打印的一些数据。这可能有助于解决问题,并且会显示这些注释已被删除但会重新出现。

2011-04-25 20:11:40.877 Caltio[4039:707] NOTES ON STARTUP
2011-04-25 20:11:40.888 Caltio[4039:707] (
    "<Notes: 0x1855d0> (entity: Notes; id: 0x184cd0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p2> ; data: <fault>)",
    "<Notes: 0x1858b0> (entity: Notes; id: 0x184ce0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p3> ; data: <fault>)"
)
2011-04-25 20:16:41.561 Caltio[4039:707] DELETING..
2011-04-25 20:16:41.569 Caltio[4039:707] <Notes: 0x1855d0> (entity: Notes; id: 0x184cd0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p2> ; data: {
    added = "2011-04-25 17:56:15 +0000";
    identifier = 2567446185;
    note = Test;
    updated = 0;
})
2011-04-25 20:16:41.589 Caltio[4039:707] NOTES AFTER REFRESH:
2011-04-25 20:16:41.595 Caltio[4039:707] (
    "<Notes: 0x1858b0> (entity: Notes; id: 0x184ce0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p3> ; data: {\n    added = \"2011-04-25 17:57:26 +0000\";\n    identifier = 2567446127;\n    note = Test;\n    updated = 0;\n})"
)

2011-04-25 20:17:05.103 Caltio[4052:707] NOTES ON STARTUP
2011-04-25 20:17:05.115 Caltio[4052:707] (
    "<Notes: 0x1bee60> (entity: Notes; id: 0x1be570 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p2> ; data: <fault>)",
    "<Notes: 0x1bf150> (entity: Notes; id: 0x1bdcd0 <x-coredata://DC8B3294-6D87-4236-9E5C-29E11F7330FA/Notes/p3> ; data: <fault>)"
)

【问题讨论】:

    标签: iphone core-data object


    【解决方案1】:

    您保存您的managedObjectContext 吗?据我了解,添加、修改和删除对象只会真正影响它们的内存表示。您还需要保存上下文以将其持久化。

    【讨论】:

    • 在我的AppDelegate中,有一个方法叫- (void)saveContext,这个是在创建项目时添加的。我猜managedObjectContext 保存在这里。除此之外,我什么也不做。还有其他方法可以保存吗?
    • NSManagedObjectContext 有一个名为save: 的方法。应用程序委托中saveContext 的版本,假设您指的是模板中的那个,仅在应用程序终止时保存。当然,在 iOS4 中这几乎是不可能的。
    • 太好了!我认为它是使用saveContext 保存的。非常感谢你!嗯,现在我已经学会了。太棒了:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2016-03-24
    相关资源
    最近更新 更多