Могу ли я разделить класс DDL и класс DML в Sqlite.swift? и могу ли я наследовать db (Connection ()) класса DDL к классу DML? - PullRequest
0 голосов
/ 14 апреля 2020

Во-первых, я использую 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? пожалуйста, помогите мне!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...