2013-09-12 2 views
8

При компиляции и запуска в XCode проект с использованием Core Data я получаю сообщение об ошибке, я никогда не видел раньше:CoreData: ошибка: (14) Ошибка ввода/вывода для базы данных

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, удалите полученные данные, удалите приложение.

Я проверил this question перед публикацией, и я считаю, что проблема в другом.

Примечание: 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. 

ответ

6

Теперь, когда NDA на iOS7 был поднят, я могу опубликовать его для завершения обходного пути, который я нашел для этой проблемы.

Основные данные в iOS7 используются по умолчанию WAL в sqlite.

Единственное решение, которое сделал работу было создать SQLite с помощью iOS6 тренажера без 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; 
} 
+0

Легче просто отключить WAL, как здесь: http://stackoverflow.com/a/18870738/288860 – mclin

+0

Большое спасибо за это, искал решение в Интернете целую вечность. Настолько разочаровывает, что документация по использованию предварительно заполненного db для чтения в IOS настолько отсутствует. – user1785227

3
NSURL *storeURL = [[NSBundle mainBundle] 
        URLForResource:@"database" withExtension:@"sqlite"]; 

строит путь внутри пакета приложения, который доступен только для чтения. Постоянное хранилище файл должен находиться в доступном для записи каталоге, например. в директории «Документы».

EDIT: выше Ответ на самом деле не так, то это можно открыть только для чтения файла дампа данных из пакета приложения (с помощью NSReadOnlyPersistentStoreOption). Единственное, что я могу себе представить, это то, что связанный файл не является допустимой базой данных Core Data. Добавление аргумента запуска

 
-com.apple.CoreData.SQLDebug 1 

может помочь в решении проблемы.

+0

Хотя вы, вероятно, правы, это * * является необычным, что он не в состоянии откройте базу данных только для чтения из доступного только для чтения местоположения. – elslooo

+1

Он всегда работал. Я не уверен, почему база данных, доступная только для чтения, должна находиться в документах – ppaulojr

+0

@ppaulojr: вы правы (и я написал этот ответ слишком быстро :-) - Может быть, что связанный файл не является допустимой базой данных Core Data (сопоставление текущая модель)? –

Смежные вопросы