即使重置后,NSManagedObjectContext也有过时的数据

时间:2012-01-05 19:32:54

标签: ios core-data nsmanagedobjectcontext

我在iOS应用程序中使用SQLite支持的CoreData。 在应用程序的某个点上,我想清除数据库中的所有数据并从头开始。我从NSPersistentStoreCoordinator中删除了我的NSPersistentStore,然后从磁盘上删除了DB文件,在磁盘上创建了一个新文件,创建了一个新的NSPersistentStore并将其附加到NSPeristentStoreCoordinator。 我还调用了重置方法我的NSManagedObjectContext对象。 此时,发生了一些非常奇怪的事情。对于NSManagedObjectContext的大多数获取请求,由于数据库为空,因此不返回任何数据。但是对于某些提取子集,我得到了数据。这是错的。数据库中没有数据。

我的问题的一个解决方案是在更改NSPersistentStore时创建新的NSManagedObjectContext,但为什么这是必要的呢?

问题:

不应该'[NSManagedObjectContext reset]'清除所有缓存并从数据库中检索新数据?为什么大多数查询行为正常,只有一些返回旧数据? 我真的想了解NSManagedObjectContext或NSPersistentStoreCoordinator中发生的缓存。

以下是删除并重新创建数据库时运行的代码。

- (void) deleteDataStore 
{
    NSError * error = nil;
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],     NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    NSURL *storeURL = [NSURL fileURLWithPath:[self getDataStorePath]];

    // Remove persistent store
    for (int i=[[ self.coordinator persistentStores ] count]; i--; ) {
        [ self.coordinator removePersistentStore: [[ self.coordinator persistentStores ] objectAtIndex:i] error: &error ];
    }

    // Delete database file
    [ self deleteDataStoreInternal ];

    // Recreate database
    [ self createDatabase: &error options: options storeURL: storeURL ];
}

- (BOOL) deleteDataStoreInternal
{    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError * error = nil;

    // Delete database file
    if ( [fileManager fileExistsAtPath: [self getDataStorePath] ] ) {
        return [fileManager removeItemAtPath: [self getDataStorePath] error: &error];
    }

    return YES;
}
- (BOOL) createDatabase: (NSError **) error options: (NSDictionary *) options storeURL: (NSURL *) storeURL  
{

    if ([self.coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:error]) {
        self.isInitialized = YES;
    } else {
        self.isInitialized = NO;

    }
  return self.isInitialized;
}

0 个答案:

没有答案