SwiftUI - Возвращаемые значения из массива структур все в одной строке - PullRequest
0 голосов
/ 20 марта 2020

Я вызываю функцию для выполнения оператора select в связанной базе данных SQLite. Функция возвращает массив структур. База данных читается правильно, так как я вставил несколько команд печати в код. Однако в конечном массиве есть только 1 строка, содержащая все данные, а не 16 строк структур.

Код структуры, который находится в databaseHelper.swift, имеет вид ...

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

Код базы данных в databaseHelper:

class DatabaseHelper {

    var buttonVars = [ButtonData]()

    var database: Connection!

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

    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(passedCategory: String) -> [ButtonData] {

        do {
            let buttons = try self.database.prepare(self.buttonsTable.filter(self.category==passedCategory))
            for row in buttons {
                print("English: \(row[self.english]), ID: \(row[self.categoryID]), Indonesian: \(row[self.indonesian])")
            //    buttonVars.append(ButtonData(english: row[english], categoryID: row[categoryID], indonesian: row[indonesian]))
                buttonVars.append(ButtonData(english: row[english], categoryID: row[categoryID], indonesian: row[indonesian]))
            }
        } catch {
            print(error)
        }
        print(buttonVars[0])
        print(buttonVars[1])
        print(buttonVars[2])
        print(buttonVars[3])
        print(buttonVars[4])
        print(buttonVars[5])
        print(buttonVars[6])
        print(buttonVars[7])
        print(buttonVars[8])
        print(buttonVars[9])
        print(buttonVars[10])
        print(buttonVars[11])
        print(buttonVars[12])
        print(buttonVars[13])
        print(buttonVars[14])
        print(buttonVars[15])
        return buttonVars
    }
}

Код функции в SoundPageView.swift (эта страница вызывает функцию базы данных): ...

    func getArrayValues() {
        let buttonRows = [DatabaseHelper().queryDatabase(passedCategory: category)]
        let btnCount: Int = buttonRows.count
        print(btnCount)
        print(buttonRows[0])
    }

Значения печати в консоли показывают, что btnCount = 1, но перед возвратом массива он состоит из 16 строк. Только после того, как он возвращается, он уменьшается до 1 строки.

enter image description here

Может кто-нибудь сказать мне, что я делаю неправильно? Я не знаю, как получить доступ к данным. Спасибо.

1 Ответ

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

Я не уверен, почему вы ставите скобки в этом вызове:

let buttonRows = [DatabaseHelper().queryDatabase(passedCategory: category)]

Забавная c queryDatabase сама возвращает массив. Я думаю, что это должно быть так:

let buttonRows = DatabaseHelper().queryDatabase(passedCategory: category)

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

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