#ios #swift #iphone #sqlite
#iOS #swift #iPhone #sqlite
Вопрос:
Я пытаюсь включить предварительно созданную базу данных sqlite из Xcode в свое приложение для iOS. База данных должна обновляться, когда приложение получает определенные уведомления (в формате JSON) с веб-сервера.
База данных включена в файлы Xcode, и я вижу ее внутри инспектора.
Функция, которую я использую для вставки данных в свою базу данных, заключается в следующем:
Import SQLite
func insertItem(item: Item){
let id = Expression<Int64>("id")
let description = Expression<String>("description")
let bundle = Bundle.main
let path = bundle.path(forResource: "DatabaseLocale", ofType: "sqlite")!
let db = try! Connection("(path)")
let items = Table("Items")
let insert = items.insert(id <- Int64(item.id), description <- item.description)
do{
let rowid = try! db.run(insert)
} catch {
print("cannot modify the database")
}
do{
for itemID in try db.prepare(items){
print(itemID[id])
print(itemID[description])
}
} catch {
print("couldn't connect to database")
}
}
Теперь, когда я запускаю приложение внутри симулятора, я получаю нужный результат, поэтому новые данные, которые получает приложение, правильно записываются в базу данных, но всякий раз, когда я использую свой физический iPhone, я получаю сообщение об ошибке:
Fatal error: 'try!' expression unexpectedly raised an error: attempt to write a readonly database (code: 8)
Как мне сделать базу данных SQLite внутри приложения для iPhone изменяемой?
Комментарии:
1. Вы не можете изменять файлы внутри пакета. Вам нужно скопировать файл sqlite из пакета в папку Documents, а затем выполнить чтение / запись в этот файл. В качестве дополнительного замечания, если вы не выбираете SQLite, потому что вы уже хорошо знакомы с ним, вы можете вместо этого заглянуть в CoreData.
2. Или, вместо папки documents, каталог поддержки приложений может быть лучше.
3. Я попытался скопировать это, но это не помогло, может быть, возможным решением может быть создание базы данных при первом открытии приложения? В этом случае база данных будет сохранена в памяти или будет удалена при повторном открытии приложения?