Во-первых, я использую Sqlite.swift
Я пытаюсь разделить классы по DDL и DML. Когда я добираюсь до ViewController1, я хочу вызвать класс DDL. У DDL есть функции, которые создают базу данных и таблицы. И когда я добираюсь до ViewController2, я могу вставить данные, вызвав функцию DML. В DML есть функции, которые вставляют данные, которые я ввожу, или получаем данные в базе данных, и так далее.
вот класс DDL
import SQLite
class Database {
var database: Connection!
let user = Table("user")
let history = Table("history")
let userId = Expression<Int64>("userId")
let name = Expression<String>("name")
let email = Expression<String>("email")
let historyId = Expression<Int64>("historyId")
let merchan = Expression<String>("merchandise")
func createDB() {
self.database = nil
print("CREATE DB")
do {
let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileUrl = documentDirectory.appendingPathExtension("test").appendingPathExtension("sqlite3")
let fileMng = FileManager.default
if fileMng.fileExists(atPath: fileUrl.path) {
do {
try fileMng.removeItem(at: fileUrl)
print("remove db file because you already have db")
}
catch {
print("Remove DB Error", error)
}
}
let database = try Connection(fileUrl.path)
self.database = database
print("Successfully create database")
createUser()
createMerchan()
}
catch {
print("Create DB Error : ", error)
}
}
func createUser() {
do {
try self.database.run(user.create(block: { (table) in
table.column(self.userId, primaryKey: true)
table.column(self.name)
table.column(self.email, unique: true)
}))
print("Create User Table")
}
catch {
print(error)
}
}
func createMerchan() {
do {
try self.database.run(history.create(block: { (table) in
table.column(self.historyId, primaryKey: true)
table.column(self.merchan)
table.column(self.userId)
table.foreignKey(self.userId, references: user, self.userId)
}))
print("Create Merchandise Table")
}
catch {
print(error)
}
}
}
Как видите, я хочу создать пользовательскую таблицу, и есть столбцы (userId, name, email). А в таблице истории будут храниться данные о покупках пользователя, имеющие отношение к пользовательской таблице, ссылающейся на userId. (Этот проект просто тестовый. Даже если таблица History странная, просто дайте ей go.)
Я ввел ViewController1, и все таблицы созданы хорошо! Но если я хочу вызвать класс DML при вводе ViewController2, мне нужны Connection и Table and Expression в базе данных. Потому что они все в классе DDL, а не в классе DML. Я думаю, что мне нужно наследовать или получать параметры, чтобы перенести их из класса DDL в класс DML. Но когда я это делаю, всегда появляется ошибка.
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
Я думаю, это означает, что база данных равна нулю ... Класс DML здесь.
import SQLite
class DML: Database{
func getAllUser() {
do {
let users = try database.prepare(user) // I put super. in front of the database, but it was the same.
for user in users {
print("id: \(user[userId]), name: \(user[name]), email: \(user[email])")
}
} catch {
print(error)
}
}
}
Я привел только один запрос 'select' для функции, чтобы вы могли легко его увидеть. Я использовал наследство. Я думаю, что способ получить параметры сделает код грязным и сложным. Потому что ViewController отличается друг от друга. Поэтому я хочу избежать этого.
По моему мнению, база данных, унаследованная от DML, не равна нулю. Потому что я вызвал класс DDL перед вызовом класса DML.
Как я могу использовать базу данных, созданную другим ViewController? пожалуйста, помогите мне!