RestKit和CoreData问题无法关闭日志模式

时间:2014-05-23 05:27:51

标签: ios core-data restkit restkit-0.20

我刚刚开始使用RestKit框架v0.20.3直接使用Core Data。我正在尝试关闭日志模式以在SQLite数据库浏览器中查看数据库。我使用以下代码将NSSQLitePragmaOption设置为@ {@“journal_mode”:@“delete”}:

NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption:@YES,
                           NSInferMappingModelAutomaticallyOption:@YES,
                           NSSQLitePragmasOption : @{@"journal_mode": @"delete"}
                         };
NSError *error;
NSPersistentStore *persistentStore = [objectStore addSQLitePersistentStoreAtPath:storePath
                                                          fromSeedDatabaseAtPath:nil
                                                               withConfiguration:nil
                                                                         options:options
                                                                           error:&error];

然而,这似乎没有关闭日志模式并删除.sqlite-wal文件。当我直接使用Core Data并添加此选项时,它可以完美运行。有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

我发现在RestKit的其他地方调用了addPersistentStoreWithType,并且需要使用相同的选项才能禁用日记功能。就我而言,我使用RKManagedObjectImporter创建种子数据库,如下所示:

NSError * error = nil;
NSString * seedFilePath = [[NSBundle mainBundle] pathForResource:@"seed" ofType:@"json"];

NSString * documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString * path = [documentsPath stringByAppendingPathComponent:@"MyDB.sqlite"];

RKManagedObjectImporter * importer = [[RKManagedObjectImporter alloc] initWithManagedObjectModel:_objectManager.managedObjectStore.managedObjectModel storePath:path];
[importer importObjectsFromItemAtPath:seedFilePath withMapping:mapping keyPath:keyPath error:&error];
BOOL success = [importer finishImporting:&error];
if (success) {
    [importer logSeedingInfo];
} else {
    RKLogError(@"Failed to finish import and save seed database due to error: %@", error);
}

即使在对RKManagedObjectStore进行上述更改后,我仍然在这里看到-shm和-wal文件。它显然不关心用于创建_object_manager.managedObjectStore类型RKManagedObjectStore的选项。

我发现,在RKManagedObjectImporter.m中,createPersistentStoreCoordinator方法也添加了自己的持久存储,所以我添加了选项字典:

NSDictionary * options = @{ NSSQLitePragmasOption : @{ @"journal_mode" : @"DELETE" } };
NSPersistentStore *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                              configuration:nil
                                                                                        URL:storeURL
                                                                                    options:options error:error];
if (! persistentStore) {
    return nil;
}

结束......好吧,这样做至关重要,因为如果没有它,种子数据库将丢失数据。现在我的-shm和-wal文件都没了。谢谢,BTW,因为上面的回答帮助我追捕了另一个位置。

答案 1 :(得分:1)

我遇到了同样的问题。在iOS 6中工作的代码突然开始在iOS 7中显示一些错误(数据丢失)。

我添加了NSSQLitePragmasOption: @{ @"journal_mode": @"DELETE"}选项RKManagedObjectStore对象,但我仍然遇到了这个问题。

所以,一边经历

- (NSPersistentStore *)addSQLitePersistentStoreAtPath:(NSString *)storePath fromSeedDatabaseAtPath:(NSString *)seedPath withConfiguration:(NSString *)nilOrConfigurationName options:(NSDictionary *)nilOrOptions error:(NSError **)error

RKManagedObjectStore.m类的方法,我发现了这条评论

/ **      组合配置和迁移似乎有问题。这样做分两步:首先,使用NO配置附加商店,但使用迁移选项;然后删除它并重新附加WITH配置,但不是迁移选项。 ** /

这里使用“seedOptions”重新初始化“persistentStore”,跳过我提供的“选项”。 所以对于我的项目,我不需要任何配置,所以我在下面注释了它并开始工作。

    if (! [self.persistentStoreCoordinator removePersistentStore:persistentStore error:error]) return nil;

NSDictionary *seedOptions = @{ RKSQLitePersistentStoreSeedDatabasePathOption: (seedPath ?: [NSNull null]) };
persistentStore = [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nilOrConfigurationName URL:storeURL options:seedOptions error:error];
if (! persistentStore) return nil;

现在没有生成wal和shm文件,我的代码按预期工作。

希望这有帮助。