2010-08-20 131 views
3

當使用核心數據模型創建了SQLite數據庫,在這一行:Xcode的SQLite數據庫創建無Z_METADATA

if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 

我得到一個錯誤:

NSUnderlyingException=I/O SQLite error code:1, 'no such table: Z_METADATA'     

任何想法如何解決這一問題?我一直在努力幾天。數據庫被創建並複製到我的設備上的文檔目錄中。

注:

如果我刪除該應用程序,重建,並安裝設備上 - 前兩天.sqlite文件過時,.mom文件昨天過時。數據庫是否在編譯時根據需要重新創建?我的項目中沒有.sqlite文件,只有.xcdatamodel。

謝謝你的時間。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [documentPaths objectAtIndex:0]; 

    //\MOVES DATABASE TO NEW LOCATION 
    NSString *storePath = [documentsDirectory stringByAppendingPathComponent:@"myShoeDatabase.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    // If the expected store doesn’t exist, copy the default store. 
    if (![fileManager fileExistsAtPath:storePath]) { 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myShoeDatabase" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
     } 
    } 

    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

    NSError *error = nil; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return persistentStoreCoordinator_; 
} 

enter code here 
+0

你可以顯示你的代碼來創建PSC('initWithManagedObjectModel:') – falconcreek 2010-08-20 20:02:24

+2

SQLite持久存儲數據庫是如何創建的?您不能只使用任何舊的SQLite數據庫,它需要採用Core Data生成的確切格式。 – 2010-08-20 21:23:45

+0

我加了我的代碼。我正在使用由核心數據創建的數據庫。感謝您的關注和幫助Brad,falcon和MPelletier。 – Bryan 2010-08-20 21:50:30

回答

0

請與此基本健全檢查啓動:將數據庫到Mac,與sqlite3.exe打開它,看看錶是否存在。

如果是,那麼你的程序指向錯誤的數據庫。 如果不是,那麼你的表從未被創建過(或者數據庫像地獄一樣腐敗,但這會令人驚訝)。

+0

我可以將數據庫從我的設備傳輸到我的Mac,並用Firefox的SQLite Manager打開它,沒有任何問題。我不確定Core Data創建數據庫時如何指向錯誤的數據庫,並將其成功複製到文檔文件夾(通過瀏覽我的設備文件進行驗證)。 – Bryan 2010-08-20 21:46:19

0

核心數據似乎在打開商店時首先查找元數據,因此有關Z_METADATA的投訴通常表示損壞的文件或格式錯誤的文件。我會懷疑複製文件存在問題(權限,損壞等)或options存在問題。

我建議:

  1. 開商店的應用程序包,即作爲只讀而不復制它,看看它是否打開罰款。如果是這樣,那麼問題在於複製。
  2. 給複製方法提供一個錯誤並記錄它的返回值。副本可能會巧妙地失敗。
  3. 獲取複製文件的大小。該文件可能在目錄中結束,但是爲空。
  4. 通過一個nil選項字典,以確保這不是問題。
+0

1.應用程序包商店給出相同的結果 2.副本完美工作 3.複製文件和默認文件的大小都是8kb 4.我最初通過零,我得到相同的錯誤。 感謝您的建議。任何其他? – Bryan 2010-08-21 16:55:46

0

首先,你需要捕捉這些錯誤,至少他們報告:

[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 

此外,該方法返回成功或失敗的BOOL,你應該留意這一點。

除此之外,假設sqlite文件有效,代碼沒有任何明顯的錯誤。你可以在示例應用程序中複製它嗎?如果是這樣,你可以在你的問題中發佈一個鏈接,我會很高興爲它修補。如果事實證明這是一個蘋果的bug,那麼你將會準備好測試用例。如果它在測試中不重複,那麼您可以比較差異以查看原始應用程序中的錯誤。