2014-05-23 18 views
0

我刚刚开始使用RestKit框架v0.20.3而直接使用Core Data。我试图关闭日志模式以在SQLite数据库浏览器中查看数据库。我设置了NSSQLitePragmaOption为@ {@“journal_mode”:@“删除”}用下面的代码:RestKit和CoreData问题无法关闭日记模式

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,沃尔玛文件。当我直接使用核心数据并添加此选项时,它可以很好地工作。有什么我失踪?

+0

显示核心数据堆栈设置的更多代码以及此代码如何与RestKit链接。 – Wain

回答

1

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

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

因此,要通过

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

方法,同时,我发现这条评论

/** 似乎有麻烦结合配置和迁移。因此,请分两步进行:首先,使用NO配置附加商店,但使用WITH迁移选项;然后将其删除并重新附加配置,但不包含迁移选项。 **/

这里“persistentStore”重新初始化为“seedOptions”跳过我提供的“选项”。 因此,对于我的项目,我不需要任何配置,所以我在下面的行中进行了评论,并开始工作。

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; 

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

希望这会有所帮助。

+0

感谢您的帮助,解决了我的问题 – link0047

2

我发现addPersistentStoreWithType在RestKit的其他地方被调用,并且需要具有相同的选项才能禁用日记功能。就我而言,我是用RKManagedObjectImporter创建一个种子DB如下:

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); 
} 

我还在这里看到了-shm和-wal文件甚至使以RKManagedObjectStore上述变更后。它显然不关心用于创建类型RKManagedObjectStore_object_manager.managedObjectStore的选项。

我发现,在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文件不见了。谢谢,顺便说一句,因为上述答案帮助我追捕其他地点。