Самый чистый и безопасный способ включить предварительно заполненный файл .sqlite в приложение Swift

#swift #database #sqlite

Вопрос:

Файл необходимо прочитать и записать позже. На Android я использовал Room amp; RoomAssetHelper.

Я понимаю основную логику, согласно которой мне нужно включить его в ресурсы проекта, а затем скопировать его в место, доступное для приложения при первом запуске. Но я хочу избежать написания этих вещей вручную и риска ошибки (я не слишком уверен в чтении файлов и баз данных).
Все ответы, которые я нахожу, исходят от людей, дающих быстрые и грязные советы о том, как вручную кодировать логику для этого. Я хотел бы сделать это на чистом и профессиональном уровне.

Есть ли библиотека, которая выполняла бы большую часть «рискованной» работы за меня?
(Имеется в виду импорт и копирование файла .sqlite, чтобы я мог начать использовать его в своем коде)


Я нашел GRDB.swift, но я не могу понять, поддерживает ли он предварительно заполненные файлы.

Ответ №1:

Пожалуйста, перестаньте искать волшебную библиотеку, которая сделает все это за вас автоматически.


Что вам нужно сделать самому без какой-либо библиотеки SQLite?

  1. Добавьте свой предварительно database.sqlite заполненный ресурс в качестве актива в свой проект.
  2. При запуске приложения проверьте, находится ли database.sqlite файл в ожидаемом месте (например, в каталоге документов вашего приложения). Вы можете проверить это с помощью FileManager API.
  3. Если файл существует по ожидаемому пути, все в порядке, копировать какой-либо файл не нужно.
  4. Если database.sqlite файл не существует по ожидаемому пути, вам необходимо скопировать database.sqlite файл по этому пути с помощью FileManager API.

ВНИМАНИЕ : Имейте в виду, что на этом шаге вы можете столкнуться с ошибкой при копировании файла. В большинстве случаев этого не должно происходить. В редких случаях, когда это действительно происходит, вы должны соответствующим образом настроить свое приложение — каким-то образом указать пользователю, что инициализация не удалась, освободить место на телефоне, перезапустить приложение и т.д.

Шаги 2-4 необходимо проверять при каждом запуске приложения — поместите эту логику где-нибудь рядом с процессом запуска приложения. Если все вышеперечисленные инструкции выполнены и вы успешно выполнили шаг 3 ИЛИ 4, теперь у database.sqlite вас есть файл, в котором вы хотите его видеть.


Откуда берется библиотека SQLite?

На этом этапе вы можете использовать любую библиотеку, которая соответствует вашим целям и с которой вы чувствуете себя комфортно.

Как вы уже упоминали GRDB.swift , это позволяет вам указать пользовательский путь для файла базы данных. Скопируйте и вставьте код минимальной настройки текущей версии здесь для справки.

 import GRDB

// 1. Open a database connection
let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")

// 2. Define the database schema
try dbQueue.write { db in
    try db.create(table: "player") { t in
        t.autoIncrementedPrimaryKey("id")
        t.column("name", .text).notNull()
        t.column("score", .integer).notNull()
    }
}

// 3. Define a record type
struct Player: Codable, FetchableRecord, PersistableRecord {
    var id: Int64
    var name: String
    var score: Int
}

// 4. Access the database
try dbQueue.write { db in
    try Player(id: 1, name: "Arthur", score: 100).insert(db)
    try Player(id: 2, name: "Barbara", score: 1000).insert(db)
}

let players: [Player] = try dbQueue.read { db in
    try Player.fetchAll(db)
}
 

Комментарии:

1. Хорошо, спасибо за заверения. Вы правы, посмотрев на все это еще раз, я думаю, что это не так плохо и рискованно, как казалось раньше. Я даже нашел конкретную запись из GRDB о своем вопросе: как открыть базу данных, хранящуюся в качестве ресурса моего приложения?