Значение параметра строки android sqlite не работает [дубликат]

Я использую встроенный обработчик error:

$("img").error(function () {
  $(this).unbind("error").attr("src", "broken.gif");
});

error() устарел в 1,8 или выше.

6
задан uncle Lem 2 August 2013 в 13:51
поделиться

3 ответа

Согласно документации SQLite ,

Любой столбец в базе данных SQLite версии 3, за исключением столбца INTEGER PRIMARY KEY, может использоваться для хранения значения любого класс хранения.

В контексте моего случая это означает, что мы не можем быть уверены, какой тип данных будет храниться в столбцах. Если вы можете управлять и преобразовывать типы данных, когда они помещаются в базу данных, вы можете преобразовать значения id в TEXT при добавлении данных в базу данных и легко использовать selectionArgs. Но это не ответ на мой вопрос, потому что мне приходится иметь дело с содержимым базы данных как есть.

Итак, возможные решения:

a) встроить целочисленные значения в строку selection без обертывая их в ':

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "id = " + getSID(db), null, null, null, null);

b) отличает значения от selectionArgs: CAST(? as INTEGER) или CAST(id AS TEXT). Я думаю, что преобразование столбца в TEXT является лучшим решением, потому что правый операнд всегда TEXT, но левым может быть что угодно. Итак:

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "CAST(id AS TEXT) = ?", 
                    new String[]{getSID(db)}, null, null, null);
2
ответ дан uncle Lem 19 August 2018 в 17:30
поделиться

Эти параметры запроса могут быть только строками - это ужасная ошибка дизайна в API базы данных Android.

Несмотря на то, что в документации говорится, вы должны использовать параметры только для фактических значений строк; целочисленные значения могут быть безопасно встроены непосредственно в строку SQL. (Для blobs вы должны использовать функцию, которая принимает ContentValues.)

Обратите внимание, что хотя SQLite использует динамическую типизацию , значения разных типов делают not сравнивают в большинстве случаев одинаково (SELECT 42='42'; возвращает 0). Существуют некоторые случаи, когда SQLite делает автоматически преобразовывать значения из-за слияния типа типа (в вашем случае это произойдет, если вы объявили столбец id как INTEGER), но это довольно противоречиво, поэтому на него нельзя положиться.

8
ответ дан CL. 19 August 2018 в 17:30
поделиться
  • 1
    Я попытался объявить поле ID как ID INTEGER PRIMARY KEY и ID TEXT PRIMARY KEY, но это не помогло. Есть ли способ использовать selectionArgs без вставки значений в строку выбора? – uncle Lem 2 August 2013 в 11:50
  • 2
    Найдено: CAST(? as INTEGER) работает отлично. Он больше похож на грязный хак, но он работает. – uncle Lem 2 August 2013 в 13:24
  • 3
    Но, думаю, CAST(column AS TEXT) должно быть лучшим решением. – uncle Lem 2 August 2013 в 13:41
  • 4
    блестящий !! Ты спас мой день !!! – Lisa Anne 5 February 2016 в 12:35

Вам нужно преобразовать ваш int id в string перед тем, как перейти к вашему запросу, потому что массив параметров имеет строку типа. Например:

cursor = builder.query(db, new String[]{"col1", "col2", "col3"},
    "id = ?", new String[]{String.valueOf(getSID(db))}, null, null, null);

Причина, по которой он работает во втором типе запроса, заключается в том, что вы добавляете целочисленное значение со строкой, которая автоматически преобразует int в String. Например:

int i = 10;
String s = i + "";   //now 10 is in string
1
ответ дан waqaslam 19 August 2018 в 17:30
поделиться
  • 1
    Извините, я забыл сказать, что getSID (db) возвращает объект String. Если он вернет int, я просто получил ошибку компиляции incompatible types. – uncle Lem 2 August 2013 в 11:02
  • 2
    Я предпочитаю путь с String.valueOf(i), я думаю, что это чище и понятно для человека, я думаю. – Simon Dorociak 2 August 2013 в 11:02
  • 3
    String.valueOf(String)? Это чепуха. Я также попытался сделать getSID return int и использовать String.valueOf, но это тоже не помогло. – uncle Lem 2 August 2013 в 11:13
Другие вопросы по тегам:

Похожие вопросы: