Я использую встроенный обработчик error
:
$("img").error(function () {
$(this).unbind("error").attr("src", "broken.gif");
});
error()
устарел в 1,8 или выше.
Согласно документации SQLite ,
Любой столбец в базе данных SQLite версии 3, за исключением столбца INTEGER PRIMARY KEY, может использоваться для хранения значения любого класс хранения.
blockquote>В контексте моего случая это означает, что мы не можем быть уверены, какой тип данных будет храниться в столбцах. Если вы можете управлять и преобразовывать типы данных, когда они помещаются в базу данных, вы можете преобразовать значения
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);
Эти параметры запроса могут быть только строками - это ужасная ошибка дизайна в API базы данных Android.
Несмотря на то, что в документации говорится, вы должны использовать параметры только для фактических значений строк; целочисленные значения могут быть безопасно встроены непосредственно в строку SQL. (Для blobs вы должны использовать функцию, которая принимает ContentValues
.)
Обратите внимание, что хотя SQLite использует динамическую типизацию , значения разных типов делают not сравнивают в большинстве случаев одинаково (SELECT 42='42';
возвращает 0
). Существуют некоторые случаи, когда SQLite делает автоматически преобразовывать значения из-за слияния типа типа (в вашем случае это произойдет, если вы объявили столбец id
как INTEGER
), но это довольно противоречиво, поэтому на него нельзя положиться.
ID
как ID INTEGER PRIMARY KEY
и ID TEXT PRIMARY KEY
, но это не помогло. Есть ли способ использовать selectionArgs без вставки значений в строку выбора?
– uncle Lem
2 August 2013 в 11:50
CAST(? as INTEGER)
работает отлично. Он больше похож на грязный хак, но он работает.
– uncle Lem
2 August 2013 в 13:24
Вам нужно преобразовать ваш 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
incompatible types
.
– uncle Lem
2 August 2013 в 11:02
String.valueOf(i)
, я думаю, что это чище и понятно для человека, я думаю.
– Simon Dorociak
2 August 2013 в 11:02
String.valueOf(String)
? Это чепуха. Я также попытался сделать getSID
return int
и использовать String.valueOf
, но это тоже не помогло.
– uncle Lem
2 August 2013 в 11:13