我刚刚开始使用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并添加此选项时,它可以完美运行。有什么我想念的吗?
答案 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文件,我的代码按预期工作。
希望这有帮助。