8

を使用して XCode でプロジェクトをコンパイルして実行すると、Core Dataこれまでに見たことのないエラーが発生します。

 2013-09-12 16:59:10.156 myapp[57811:70b] CoreData: error: 
      (14) I/O error for database at /Users/administrador/Library/
         Application Support/iPhone Simulator/7.0/Applications/
         6BA67336-B093-46CF-8B11-E3595409DAC2/myapp.app/database.sqlite.  

         SQLite error code:14, 'unable to open database file'

このメッセージを生成するコードは次のとおりです。

    psc = [[NSPersistentStoreCoordinator alloc]
                   initWithManagedObjectModel:self.managedObjectModel];
    NSURL *storeURL = [[NSBundle mainBundle] 
                         URLForResource:@"database" withExtension:@"sqlite"];
    [psc addPersistentStoreWithType:NSSQLiteStoreType 
             configuration:nil URL:storeURL 
             options:@{NSReadOnlyPersistentStoreOption : @YES} error:NULL];

Build->Clean派生データの削除、アプリのアンインストールを試しました。

投稿する前にこの質問を確認しましたが、問題は異なると思います。

注: sqlite はアプリのリソースです

提案されたデバッグを使用した情報

2013-09-12 17:43:38.341 myapp[58322:70b] CoreData: annotation: Connecting to sqlite database file at "/Users/administrador/Library/Application Support/iPhone Simulator/7.0/Applications/6BA67336-B093-46CF-8B11-E3595409DAC2/myapp.app/database.sqlite"
2013-09-12 17:43:38.360 myapp[58322:70b] CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
2013-09-12 17:43:38.363 myapp[58322:70b] CoreData: annotation: Disconnecting from sqlite database due to an error.
2013-09-12 17:43:38.364 myapp[58322:70b] CoreData: error: (14) I/O error for database at /Users/administrador/Library/Application Support/iPhone Simulator/7.0/Applications/6BA67336-B093-46CF-8B11-E3595409DAC2/myapp.app/database.sqlite.  SQLite error code:14, 'unable to open database file'
2013-09-12 17:43:38.366 myapp[58322:70b] CoreData: annotation: Disconnecting from sqlite database.
4

2 に答える 2

6

iOS7 の NDA が解除されたので、この問題に対して見つけた回避策を完成のために投稿できます。

iOS7 の Core Data は、デフォルトWALsqlite.

機能した唯一の解決策は、iOS6 シミュレーターを使用せずに sqlite を作成し、WALそれをプロジェクトにインポートすることでした。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    static NSPersistentStoreCoordinator *psc;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        psc = [[NSPersistentStoreCoordinator alloc] 
                 initWithManagedObjectModel:self.managedObjectModel];
        NSURL *storeURL = [[NSBundle mainBundle] 
                  URLForResource:@"database" withExtension:@"sqlite"];
        [psc addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:storeURL
                                options:@{NSReadOnlyPersistentStoreOption : @YES,
                             NSSQLitePragmasOption: @{@"journal_mode":@"DELETE"}}
                                  error:NULL];
    });
    return psc;
}
于 2013-09-19T16:41:00.260 に答える
3
NSURL *storeURL = [[NSBundle mainBundle] 
                     URLForResource:@"database" withExtension:@"sqlite"];

読み取り専用のアプリケーション バンドル内にパスを作成します。永続ストア ファイルは、「Documents」ディレクトリなどの書き込み可能なディレクトリに存在する必要があります。

編集:上記の答えは実際には間違っています。アプリケーション バンドルから読み取り専用の Core Data ファイルを開くことNSReadOnlyPersistentStoreOptionできます (を使用)。私が現在想像できる唯一のことは、バンドルされたファイルが有効な Core Data データベースではないということです。起動引数の追加

-com.apple.CoreData.SQLDebug 1

問題を特定するのに役立つ場合があります。

于 2013-09-12T20:21:27.477 に答える