SQLite - возможно ли вставить BLOB с помощью оператора вставки? - PullRequest
13 голосов
/ 16 января 2012

Я разрабатываю приложение для 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')"}    

}

Любая помощь будет высоко ценится,

Спасибо, Тулио Зан

Ответы [ 2 ]

21 голосов
/ 16 января 2012

Если вы действительно, очень хотите, вы можете использовать очень длинный шестнадцатеричный литерал как литерал BLOB-объекта:

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-запросов путем склеивания строк следует избегать любой ценой.

0 голосов
/ 19 августа 2012

В вашей таблице данных есть невидимое слово , которое вы не можете видеть. Проверьте файл db с помощью инструментов db, таких как navicat для sqlite. Обратите внимание на слово ошибки в таблице.

...