Swift2.3: ошибка массива sqlite с «неустранимой ошибкой: индекс вне диапазона»

#swift #sqlite

#swift #sqlite

Вопрос:

Я пытаюсь включить использование sqlite для хранения данных.

И я просто проверяю приведенный выше код функции

 if segmentControl.selectedIndex == 0 {
        let recipe = recipes[indexPath.row]
        let aux:AnyObject = data[indexPath.row]

        let table_recipeName = aux["recipeName"]
        cell.nameLabel.text = table_recipeName as? String

        let table_recipeType = aux["recipeType"]
        cell.typeLabel.text = table_recipeType as? String

        let table_recipeImage = aux["recipeImage"]
        cell.thumbnailImageView.image = UIImage(named: table_recipeImage as! String)

        let table_recipeIsFavor = aux["recipeIsFavor"]
        cell.favorIconImageView.hidden = !recipe.isFavor

        let table_recipeUserPhoto = aux["recipeUserPhoto"]
         cell.userPhoto.image = UIImage(named: table_recipeUserPhoto as! String)

        let table_recipeUserName = aux["recipeUserName"]
        cell.userName.text = table_recipeUserName as? String


    }
  

и функция sqlite здесь

  //**********************SQLite********************************//
var statement = COpaquePointer()
var data: [[String: AnyObject]] = []

func loadData() {
    let db_path = "/Users/huangpinquan/Desktop/Recipes/Recipes/Recipes.sqlite"
    var db = COpaquePointer()

    let status = sqlite3_open(db_path,amp;db)
    if (status == SQLITE_OK) {
        print("Open the sqlite success!n")
    }else {
        print("Open the sqlite failed!n")
    }

    let query_stmt = "SELECT * FROM recipe WHERE type:'麵食' "
    //let query_stmt = "SELECT * FROM recipe"
    if(sqlite3_prepare_v2(db , query_stmt, -1, amp;statement, nil) == SQLITE_OK) {
        //self.data.removeAllObjects()
        while (sqlite3_step(statement) == SQLITE_ROW) {
            var recipeArray: [String: AnyObject] = [:]

            let recipeName = sqlite3_column_text(statement, 0)
            let recipe_name = String.fromCString(UnsafePointer<CChar>(recipeName)) ?? ""

            let recipeType = sqlite3_column_text(statement, 1)
            //....just like "statement, 0"

            let recipeImage = sqlite3_column_text(statement, 2)
            //....

            let recipeIsFavor = sqlite3_column_int(statement, 3)
            //....

            let recipeUserPhoto = sqlite3_column_text(statement, 4)
            //....

            let recipeUserName = sqlite3_column_text(statement, 5)
            //....

            recipeArray["recipeName"] = recipe_name
            recipeArray["recipeType"] = recipe_type
            recipeArray["recipeImage"] = recipe_image
            recipeArray["recipIsFavor"] = recipe_isFavor
            recipeArray["recipeUserPhoto"] = recipe_userPhoto
            recipeArray["recipeUserName"] = recipe_userName

            data.append(recipeArray)
        }

        sqlite3_finalize(statement)
    }else {
        print("read the sqlite data failed")
    }

}
  

когда подобный код в «func loadData»

 let query_stmt = "SELECT * FROM recipe WHERE type:'麵食' "
  

это вызовет ошибку

неустранимая ошибка: индекс вне диапазона

но если код похож на этот, в нем нет никакой ошибки

 let query_stmt = "SELECT * FROM recipe"
  

http://imgur.com/a/x3lr1

Это весь мой код, если хотите.

https://gist.github.com/anonymous/79eb4b2506889929cfe92dfcab3731c4

Что я должен сделать, чтобы исправить эту ошибку?

Комментарии:

1. Откуда вы получаете эту ошибку? На какой линии?

2. К вашему сведению — Никогда не используйте SELECT * ... . Явно перечислите столбцы, которые вы хотите выбрать.

3. Ошибка находится в строке «пусть aux:AnyObject = data[indexPath.row]»

Ответ №1:

Не зная, откуда вы получаете свою ошибку, мне интересно, компилируется ли ваша инструкция. Я не эксперт по SQL, но "WHERE type:'...'" выглядит подозрительно. Во-первых, вы позже вызываете это поле recipeType , а во-вторых, вы, вероятно, хотите "WHERE recipeType='string literal'" , нет?

Комментарии:

1. imgur.com/a/20mko но в инструкции в SQLite нет никаких проблем, почему это ошибка в swift?

2. Я не знаю: вы не предоставляете много информации. Если вы добавите точку останова в строке ошибки, каково состояние объекта данных (каково его количество) и каково значение indexPath.row?

3. gist.github.com/anonymous/79eb4b2506889929cfe92dfcab3731c4 вот мой код

4. Я не размахиваю молотком для плотника. Я не собираюсь проводить ректальное обследование у врача, и я не запускаю отладчик для вас. Научитесь использовать инструменты вашей профессии.