#swift #database #sqlite
Вопрос:
Файл необходимо прочитать и записать позже. На Android я использовал Room amp; RoomAssetHelper.
Я понимаю основную логику, согласно которой мне нужно включить его в ресурсы проекта, а затем скопировать его в место, доступное для приложения при первом запуске. Но я хочу избежать написания этих вещей вручную и риска ошибки (я не слишком уверен в чтении файлов и баз данных).
Все ответы, которые я нахожу, исходят от людей, дающих быстрые и грязные советы о том, как вручную кодировать логику для этого. Я хотел бы сделать это на чистом и профессиональном уровне.
Есть ли библиотека, которая выполняла бы большую часть «рискованной» работы за меня?
(Имеется в виду импорт и копирование файла .sqlite, чтобы я мог начать использовать его в своем коде)
Я нашел GRDB.swift, но я не могу понять, поддерживает ли он предварительно заполненные файлы.
Ответ №1:
Пожалуйста, перестаньте искать волшебную библиотеку, которая сделает все это за вас автоматически.
Что вам нужно сделать самому без какой-либо библиотеки SQLite?
- Добавьте свой предварительно
database.sqlite
заполненный ресурс в качестве актива в свой проект. - При запуске приложения проверьте, находится ли
database.sqlite
файл в ожидаемом месте (например, в каталоге документов вашего приложения). Вы можете проверить это с помощьюFileManager
API. - Если файл существует по ожидаемому пути, все в порядке, копировать какой-либо файл не нужно.
- Если
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 о своем вопросе: как открыть базу данных, хранящуюся в качестве ресурса моего приложения?