Я относительно новичок в разработке 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"; }
Любые идеи о том, что я делаю неправильно? Некоторая помощь будет оценена! Благодарю.
Как говорится в сообщениях об ошибках: вы устанавливаете флаг NSReadOnlyPersistentStoreOption, но не хотите создавать (= писать) базу данных – freytag
Я действительно этого не делаю, я хочу открыть уже существующий файл DB, который присутствует в комплекте. Есть ли какой-либо конкретный контент в файле DB, который должен присутствовать, чтобы открыть его с помощью Xcode? Тот, который у меня есть сейчас, - это очень простая БД с 1 таблицей, которая имеет 3 столбца (2 varchars и 1 float). – soltzu
CoreData - это не просто простая база данных sqlite. Он создает таблицы с определенными именами. Если вы действительно хотите использовать CoreData, лучшим способом было бы позволить CoreData создать таблицу один раз, и вы отредактируете созданную базу данных. Если вы хотите использовать свою собственную базу данных sqlite, вам не нужно использовать CoreData. Существуют (очень сырые) функции C для чтения и записи SQL-баз данных (см. «Sqlite3.h»), но также классы Wrapper (например, https://github.com/ccgus/fmdb), поэтому вам не нужно напишите C-код. – freytag