Не получают строки из базы данных. SQLite, Android, Котлин

У меня есть функция внутри DatabaseHelper.kt:

fun readData_Inventory(barcode: String): Inventory{ 
        val p0 = this.readableDatabase
        val selection = "$COL_PRODUCTID = ?"
        val selectionArgs = arrayOf(barcode)
        val cursor = p0.query(TABLE_INVENTORY, null, selection, selectionArgs,null, null, null)
        Toast.makeText(context, "Barcode: $barcode, Count: ${cursor.count}", Toast.LENGTH_LONG).show()
        val inventory: Inventory?
        if (cursor.moveToLast()) {
            cursor.moveToLast()
            val productId = cursor.getString(cursor.getColumnIndex(COL_PRODUCTID))
            val quantity = cursor.getDouble(cursor.getColumnIndex(COL_QUANTITY))
            val source = cursor.getString(cursor.getColumnIndex(COL_SOURCE))
            val dateCheck = cursor.getString(cursor.getColumnIndex(COL_DATECHECK))
            inventory = Inventory(productId, quantity, source, dateCheck)
        } else{
            inventory = Inventory ("000", 0.0, "", "")
        }
        return inventory

Но Toast показывает 0 в cursor.count.

Я знаю, что в таблице есть строки, потому что, когда я запускаю следующий код, он приносит строки, которые я ищу:

fun readData_Inventory(barcode: String): Inventory{ 
        val p0 = this.readableDatabase
        val sql = "select * from $TABLE_INVENTORY"
        val cursor = p0.rawQuery(sql, null)
        val inventory: Inventory?
        Toast.makeText(context, "Barcode: $barcode, Count: ${cursor.count}", Toast.LENGTH_LONG).show()
        if (cursor.moveToLast()) {
            cursor.moveToLast()
            val productId = cursor.getString(cursor.getColumnIndex(COL_PRODUCTID))
            val quantity = cursor.getDouble(cursor.getColumnIndex(COL_QUANTITY))
            val source = cursor.getString(cursor.getColumnIndex(COL_SOURCE))
            val dateCheck = cursor.getString(cursor.getColumnIndex(COL_DATECHECK))
            inventory = Inventory(productId, quantity, source, dateCheck)
        } else{
            inventory = Inventory ("000", 0.0, "", "")
        }
        return inventory

Любая помощь приветствуется. Заранее спасибо.

Обновлено: Я пробовал со следующим кодом:

fun readData_Inventory(barcode: String) {
        val p0 = this.readableDatabase
        val inventory: Inventory?
        val sql = "select * from $TABLE_INVENTORY"
        val cursor = p0.rawQuery(sql, null)
        Toast.makeText(context, "Size: ${cursor.count} Move: ${cursor.moveToFirst()}", Toast.LENGTH_LONG).show()
        /////////////////
        cursor.moveToFirst()
        val productId = cursor.getString(cursor.getColumnIndex(COL_PRODUCTID))
        Toast.makeText(context, "ID: $productId", Toast.LENGTH_LONG).show()
    }

Когда я запускаю код только с первой частью (перед частью ///////), тост показывает "Size: 1, true" (это нормально, в моей таблице только 1 строка). Но когда я добавляю вторую часть (после ////////), появляется ошибка: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

Я добавляю ту часть, куда вставляю данные ... может быть, это ...

fun insertData_Inventory(inventory: Inventory){
        val p0 = this.writableDatabase
        val cv = ContentValues()
        cv.put(COL_PRODUCTID, inventory.product_id)
        cv.put(COL_QUANTITY, inventory.quantity)
        cv.put(COL_SOURCE, inventory.source)
        cv.put(COL_DATECHECK, inventory.checkDate)
        val result = p0.insert(TABLE_INVENTORY, null, cv)
        if (result == (-1).toLong())
            Toast.makeText(context, "Insert Inventory Failed", Toast.LENGTH_SHORT).show()
        else
            Toast.makeText(context, "Insert Inventory Success", Toast.LENGTH_SHORT).show()
        p0.close()
    }

Он всегда вставляет и показывает «Вставить инвентарь успешно».

Также часть, в которой я объявляю таблицу:

val TABLE_INVENTORY = "Inventory"
val COL_INVENTORYID = "inventory_id"
val COL_PRODUCTID = "product_id"
val COL_QUANTITY = "quantity"
val COL_SOURCE = "source"
val COL_DATECHECK = "date_check"
val CREATE_T_INVENTORY = "CREATE TABLE if not exists $TABLE_INVENTORY " +
        "(" +
        "$COL_INVENTORYID integer PRIMARY KEY, " +
        "$COL_PRODUCTID varchar(20), " +
        "$COL_QUANTITY double, " +
        "$COL_SOURCE varchar(20)," +
        "$COL_DATECHECK datetime, " +
        "FOREIGN KEY($COL_PRODUCTID) REFERENCES $TABLE_PRODUCT($COL_PRODUCTID)" +
        ")"

Есть другие идеи? Заранее спасибо!

Вам следует использовать """, чтобы вам не приходилось делать все эти вещи, связанные с +.

EpicPandaForce 10.07.2018 00:20

@EpicPandaForce Извините, я не понимаю, что вы имеете в виду

Said 10.07.2018 00:42
"""CREATE TABLE if not exists $TABLE_INVENTORY ( $COL_INVENTORYID integer PRIMARY KEY, ...."""
EpicPandaForce 10.07.2018 00:45

@EpicPandaForce это работает даже с несколькими строками? Поскольку я не очень хорош в этом (вы можете увидеть этот вопрос и то, как я решил его после 2 дней отладки), мне нужна структура, которую я здесь поместил, иначе я сойду с ума. Спасибо!

Said 10.07.2018 00:49

да, он работает с несколькими строками.

EpicPandaForce 10.07.2018 00:53

@EpicPandaForce, это здорово, я воспользуюсь этим. Еще раз спасибо!

Said 10.07.2018 00:53
0
6
661
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте все утверждение в rawquery:

val sql = "select * from $TABLE_INVENTORY WHERE trim($COL_PRODUCTID) = '$barcode'"
val cursor = p0.rawQuery(sql, null)

Я предполагаю, что штрих-код - ТЕКСТ

Спасибо! Все еще не работает. с '$barcode' и без апострофа ... barcode - это varchar. Есть другие идеи?

Said 09.07.2018 14:41

То же самое, не работает ... (извините за поздний ответ, это часть моего дипломного проекта, но мне пришлось пойти на работу, спасибо за ваше время, я ценю это).

Said 09.07.2018 23:00

Мой друг сказал попробовать select * from $table where $COL_PRODUCTID like '%$barcode%, и он тоже не работает ...

Said 09.07.2018 23:05

Если у вас есть время, проверьте правку в моем исходном вопросе. Спасибо

Said 09.07.2018 23:39
Ответ принят как подходящий

При инициализации объекта мне не хватало строки:

inventory.product_id = product.product_id

Спасибо, особенно @mTak

Другие вопросы по теме