Как включить базу данных SQLite для чтения и записи (существующую) в приложение для iOS из Xcode?

#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. Я попытался скопировать это, но это не помогло, может быть, возможным решением может быть создание базы данных при первом открытии приложения? В этом случае база данных будет сохранена в памяти или будет удалена при повторном открытии приложения?