2015-07-06 2 views
0

Я относительно новичок в разработке iOS, и я впервые попытался использовать CoreData.framework.Не удается открыть sqlite DB из приложения iOS

Я создал очень простую БД с «sqlitebrowser» и скопировал ее в мой проект в XCode. Я вижу, что файл включен в комплект приложения. Я пытался получить доступ к БД в AppDelegate классе, следующий метод:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    //For now using the `SQLite` store generate manually. Make sure to open the 
    //store in read only mode since we cannot modify files in the bundle. 

    NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"MatchWatcher" withExtension:@"sqlite"]; 
    //Should be like below 
    NSDictionary *storeOptions = @{NSReadOnlyPersistentStoreOption:@YES, NSSQLitePragmasOption: @{@"journal_mode":@"DELETE"} }; 
// NSDictionary *storeOptions = @{NSSQLitePragmasOption: @{@"journal_mode" : @"DELETE"} }; 
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
               configuration:nil 
                 URL:storeURL 
                options:storeOptions 
                 error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    } 

    return _persistentStoreCoordinator; 
} 

Как вы можете видеть, я пытаюсь использовать переменную storeOptions, которая включает в себя открытие ReadOnly из БД, но это дает мне следующее исключение:

2015-07-06 14:15:18.372 MatchWatcher[27495:3849154] CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite options:{ NSReadOnlyPersistentStoreOption = 1; NSSQLitePragmasOption = { "journal_mode" = DELETE; }; } ... returned error Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x7fa38a73cbb0 {NSUnderlyingException=Cannot create a new database file with the read only option at path: /Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite} with userInfo dictionary { NSUnderlyingException = "Cannot create a new database file with the read only option at path: /Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite"; } 2015-07-06 14:15:18.373 StockWatcher[27495:3849154] Unresolved error Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x7fa38a73cbb0 {NSUnderlyingException=Cannot create a new database file with the read only option at path: /Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite}, { NSUnderlyingException = "Cannot create a new database file with the read only option at path: /Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite"; }

Любые идеи о том, что я делаю неправильно? Некоторая помощь будет оценена! Благодарю.

+0

Как говорится в сообщениях об ошибках: вы устанавливаете флаг NSReadOnlyPersistentStoreOption, но не хотите создавать (= писать) базу данных – freytag

+0

Я действительно этого не делаю, я хочу открыть уже существующий файл DB, который присутствует в комплекте. Есть ли какой-либо конкретный контент в файле DB, который должен присутствовать, чтобы открыть его с помощью Xcode? Тот, который у меня есть сейчас, - это очень простая БД с 1 таблицей, которая имеет 3 столбца (2 varchars и 1 float). – soltzu

+2

CoreData - это не просто простая база данных sqlite. Он создает таблицы с определенными именами. Если вы действительно хотите использовать CoreData, лучшим способом было бы позволить CoreData создать таблицу один раз, и вы отредактируете созданную базу данных. Если вы хотите использовать свою собственную базу данных sqlite, вам не нужно использовать CoreData. Существуют (очень сырые) функции C для чтения и записи SQL-баз данных (см. «Sqlite3.h»), но также классы Wrapper (например, https://github.com/ccgus/fmdb), поэтому вам не нужно напишите C-код. – freytag

ответ

1

Файл SQLite, который использует основные данные, структурирован в закрытом виде. Он не предназначен для использования с SQLite-файлом, который вы разработали вне Core Data.

Основные данные предназначены для модели вашего приложения. Рассмотрение его как инструмента реляционной базы данных вызовет проблемы. Используйте его в качестве модели своего приложения, а затем сохраните его на диске. А не наоборот.

+0

Спасибо, Маркус, ваш ответ подобен вашему @freytag, и я создам БД с помощью вспомогательного приложения OS X. – soltzu

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