Swift 5 - Невозможно вставить данные в таблицу SQLite после выполнения SELECT - PullRequest
1 голос
/ 09 февраля 2020

У меня возникла проблема при iOS разработке приложения.

Версия Xcode: 11 Версия Swift: 5

Для приложения существует два вида - First_View и Second_View. В First_View есть представление коллекции, которое должно перечислять данные в таблице "custom_location" из SQLite. В First_View есть кнопка, которая предназначена для перехода к Second_View.

В Second_View есть представление коллекции, которое должно перечислять данные в таблице "all_location" из SQLite. Пользователь может выбрать элемент, и этот элемент будет вставлен в таблицу «custom_location».

Поведение текущей проблемы: если в таблице «custom_location» есть какая-либо запись, First_View отобразит эти данные, когда приложение будет запущен. Затем я пытаюсь нажать кнопку, чтобы перейти к Second_View и выбрать элемент. Однако этот элемент не может быть вставлен в «custom_location».

Я замечаю, что если «custom_location» в начале, Second_View способен вставлять данные в «custom_location».

Связанный код для выбора и вставки из SQLite:

public static func getCustomLocationList() -> [Int] {
    var customLocationList:[Int] = []
    var locationId:Int = -1
    var db :SQLiteConnect?
    //Database connection path
    let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let sqlitePath = urls[urls.count-1].absoluteString + Settings.dbName
    db = SQLiteConnect(path: sqlitePath)

    if let mydb = db{
        let statement = mydb.fetch("custom_location_list", cond: "location_id > 0", order: "id DESC")
        while sqlite3_step(statement) == SQLITE_ROW{
            locationId = Int(sqlite3_column_int(statement, 1))

            customLocationList.append(locationId)
        }
    }

    return customLocationList
}


public static func insertCustomLocation(_ locationId: Int){
    var db :SQLiteConnect?
    //Database connection path
    let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let sqlitePath = urls[urls.count-1].absoluteString + Settings.dbName
    db = SQLiteConnect(path: sqlitePath)

    if let mydb = db {
        mydb.insert("custom_location_list", rowInfo: ["location_id":"\(locationId)"])
    }
}

В моем SQLiteConnect.swift функции «выборка» и «вставка»:

func fetch(_ tableName :String, cond :String?, order :String?) -> OpaquePointer {
    var statement :OpaquePointer? = nil
    var sql = "select * from \(tableName)"
    if let condition = cond {
        sql += " where \(condition)"
    }

    if let orderBy = order {
        sql += " order by \(orderBy)"
    }

    sqlite3_prepare_v2(self.db, sql.cString(using: String.Encoding.utf8), -1, &statement, nil)
    return statement!
}

func insert(_ tableName :String, rowInfo :[String:String]) -> Bool {
    var statement :OpaquePointer? = nil
    let sql = "insert into \(tableName) " + "(\(rowInfo.keys.joined(separator: ","))) " + "values (\(rowInfo.values.joined(separator: ",")))"
    if sqlite3_prepare_v2(self.db, sql.cString(using: String.Encoding.utf8), -1, &statement, nil) == SQLITE_OK {
        if sqlite3_step(statement) == SQLITE_DONE {
            return true
        }
        sqlite3_finalize(statement)
    }
    return false
}

1 Ответ

0 голосов
/ 09 февраля 2020

Эта проблема была исправлена.

Причина root в том, что соединение с БД открыто другим методом, и я установил "возврат" в середине этой функции ... Тогда соединение с БД не было было завершено после завершения функции.

...