Почему RawQuery в SQLite работает только без вопросительного знака (Kotlin) - PullRequest
0 голосов
/ 16 июня 2019

Это структура и данные моей таблицы funco внутри базы данных your.db (SQLite):

Id   Disp  Tp 
 1   Ball  2
 2   Light 1
 3   Sea   4 

Это мой код:

var db = SQLiteDatabase.openDatabase(this.filesDir.path + 
          "/your.db",null, SQLiteDatabase.OPEN_READWRITE)
val c = db.rawQuery("Select Id, Disp, Tp From Funco Where Id<=2;",null)
var stat = c.moveToFirst()
var result=""
while (stat) {
    val mId = c.getInt(c.getColumnIndex("Id"))
    val mDisp = c.getString(c.getColumnIndex("Disp"))
    val mTp = c.getInt(c.getColumnIndex("Tp"))
    result += "$mId $mDisp $mTp | "
    stat = c.moveToNext()
}
c.close()
db.close()

result значение:

 1   Ball  2 | 2   Light 1 |

Если я заменю вторую строку на

val c = db.rawQuery("Select ?, ?, ? From Funco Where  ?<=2;"
             ,arrayOf("Id","Disp","Tp","Id"))    

Ошибка не возникла, но курсор пуст!

Почему?

Обновление:

Ответ @ tynn правильный.Я думаю, что документация неуловима.Я думаю, что компилятор должен выдавать ошибку, а не просто возвращать пустой курсор.

В том же духе можно написать

val c = db.query("funco",arrayOf("Id","Disp","Tp"),"Id<=?",
arrayOf("2"),null,null,null)

Но приведенный ниже код не работает

val c = db.query("funco",arrayOf("Id","Disp","Tp"),"?<=?",
    arrayOf("id","2"),null,null,null)

1 Ответ

2 голосов
/ 16 июня 2019

Как документация гласит:

selectionArgs String : Вы можете включить? S в предложении where в запросе, который будет заменен значениями из selectionArgs. Значения будут связаны в виде строк.

Знаки вопроса предназначены для привязки различных значений к предварительно скомпилированному запросу SQL. Эта функциональность не подходит для настройки столбцов, которые будут использоваться в запросе. Ваш первый подход правильный. Вы можете сделать 2 в нем динамическим, хотя:

db.rawQuery("Select Id, Disp, Tp From Funco Where Id<=?;", arrayOf("2"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...