SQLite.swift в приложении SwiftUI не будет компилироваться - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь прочитать базу данных и скопировать строки в массив в swiftUI, но я не знаю правильный синтаксис для добавления массива. Вот мой databaseHelper.swift

import Foundation
import SQLite

class DatabaseHelper {

    var database: Connection!
    var path: String
    let buttonsTable = "Button"
    var db: String

    var english: String
    var categoryID: Int
    var indonesian: String

    init() {

        do {
            let path = Bundle.main.path(forResource: "sga", ofType: "db")!
            let database = try Connection(path, readonly: true)
            self.database = database
            print("Database initialized at path \(path)")
        } catch {
            print("error")
        }
    }

    func queryDatabase() -> [ButtonData] {
        var buttonVars = [ButtonData]()
        do {
            let buttons = try self.database.prepare(self.buttonsTable)
            for user in buttons {
             //   print("English: \(user[self.english]), ID: \(user[self.ID]), Indonesian: \(user[self.indonesian])")
                buttonVars.append(ButtonData(english: row[english], categoryID: row[categoryID], indonesian: row[indonesian]))
            }
        } catch {
            print(error)
        }
        return buttonVars
    }
}

struct ButtonData: Hashable {
    let english: String
    let categoryID: Int
    let indonesian: String
}

Я не уверен, что на самом деле происходит в операторе добавления. Я хочу добавить столбцы в строке, но он ничего не принимает.

Я получаю сообщение об ошибке ...

"Невозможно добавить значение типа« Statement.Element » (он же Array>) с аргументом типа 'String'

Заранее спасибо:)

1 Ответ

1 голос
/ 16 марта 2020

buttonTable является таблицей sqlite.swift и должна быть больше чем строка.

В какой-то момент вам нужно определить вашу таблицу следующим образом:

static let buttonsTable = Table("Button")
static let english = Expression<String>("english")
static let indonesian = Expression<String>("indonesian")
static let categoryID = Expression<Int>("categoryID")

Предполагая, что ваша БД уже есть существует, вы должны иметь возможность получить к нему доступ.

Этот раздел выглядит правильно:

init() {

    do {
        let path = Bundle.main.path(forResource: "sga", ofType: "db")!
        let database = try Connection(path, readonly: true)
        self.database = database
        print("Database initialized at path \(path)")
    } catch {
        print("error")
    }
}

Но тогда вы получите к нему следующий доступ:

   func queryDatabase() -> [ButtonData] {
        var buttonVars = [ButtonData]()
        do {
            let buttons = try self.database.prepare(self.buttonsTable)
            for row in buttons {
                buttonVars.append(ButtonData(english: row[english], categoryID: row[categoryID], indonesian: row[indonesian]))
            }
        } catch {
            print(error)
        }
        return buttonVars
    }

I Я часто помещаю мои возвращаемые материалы на карту, например:

 func queryDatabase() -> [ButtonData] {
        do {
            return try self.database.prepare(self.buttonsTable).compactMap { row in
                ButtonData(english: row[english], categoryID: row[categoryID], indonesian: row[indonesian]))
            }
        } catch {
            print(error)
        }
        // Return an empty array if we caught an error
        return []
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...