2014-05-23 64 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文件不見了。謝謝,順便說一句,因爲上述答案幫助我追捕其他地點。