SQLite - Можно ли вставить BLOB через инструкцию insert?
Я разрабатываю приложение для Android, и я использую базу данных Sqlite для хранения некоторых растровых изображений. Я хочу, чтобы некоторые изображения были автоматически вставлены, когда пользователь устанавливает приложение.
Я использую класс SQLiteOpenHelper следующим образом:
public class DatabaseHelper extends SQLiteOpenHelper {
...
DatabaseHelper(Context context, String nameOfDB, int version, String[] scriptSQLCreate,
String scriptSQLDelete) {
super(context, nameOfDB, null, version);
this.scriptSQLCreate = scriptSQLCreate;
this.scriptSQLDelete = scriptSQLDelete;
}
@Override
public void onCreate(SQLiteDatabase db) {
int numScripts = scriptSQLCreate.length;
for(int i = 0; i<numScripts; i++){
Log.i(TAG,"Creating database, executing script " + i);
db.execSQL(scriptSQLCreate[i]);
}
}
}
...
Я хочу передать константу в параметр scriptSQLCreate, показанный выше, который будет таким:
private static final String[] SCRIPT_DATABASE_CREATE = {
"create table memes( id integer primary key autoincrement," +
+ " img blob not null," +
+ " name text not null unique)" ,
"insert into memes(img,name) values(BITMAP1,'1.jpg')",
"insert into memes(img,name) values(BITMAP2,'2.jpg')",
"insert into memes(img,name) values(BITMAP3,'3.jpg')"}
}
Любая помощь будет значительно оценена,
спасибо,
Тулио Зан
Ответы
Ответ 1
Если вы действительно хотите, чтобы вы могли использовать очень длинный шестнадцатеричный литерал как буквальный буквал:
insert into memes(img, name) values(X'0102030405060708090a0b0c0d0e0f', '1.jpg')
Однако это обычно плохая идея; вместо этого перейдите к параметризованным запросам. Они позволят вам скомпилировать инструкцию один раз с использованием заполнителей вместо фактических значений, а затем повторно использовать ее много раз, заполнив заполнители по мере необходимости:
SQLiteStatement p = sqlite.compileStatement("insert into memes(img, name) values(?, ?)");
byte[] data = loadData("1.jpg");
p.bindBlob(1, data);
p.bindString(2, "1.jpg");
p.execute();
byte[] data = loadData("2.jpg");
p.bindBlob(1, data);
p.bindString(2, "2.jpg");
p.execute();
(Предупреждение --- код не проверен.)
В общем, вы должны использовать параметризованные запросы везде, так как они являются надежным способом избежать атак SQL-инъекций, а также, как правило, проще и понятнее. Сборка SQL-запросов путем склеивания строк вместе следует избегать любой ценой.
Ответ 2
В вашей таблице данных есть невидимое слово, которое вы не видите. Проверьте свой файл db с помощью инструментов db, таких как navicat для sqlite. Обратите внимание на слово ошибки в таблице.