Intereting Posts
Как показать круговой текст с помощью TextView в Android Почему нет метода Service.onStop? Что такое копия iOS 'QLPreviewController или UIDocumentInteractionController на Android? Как изменить цвет фона ActionMode на Android Этот класс должен быть общедоступным (android.support.v7.internal.widget.ActionBarView.HomeView) Не удалось создать конвертер для моего класса в Android-платформе Retrofit2 converter-simplexml Как найти версию процессора ARM на устройстве Android? Проверка сохранения состояния перед выполнением FragmentTransaction Html5 canvas не поддерживает аппаратное ускорение в android 4.4 Во время установки Cordova (PhoneGap) я получаю предупреждение, как «двигатель npm WARN Cordova-js @ 3. 8.0: хотел: … " Как читать журналы вызовов после завершения и сохранения в журналах? Firebase добавляет новый ребенок с указанным именем Работа с дублирующимися записями в AndroidStudio: java.util.zip.ZipException Android твиттер твит с изображением Android: mediaplayer ушел с необработанными событиями

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')"} } 

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

Thx, Tulio Zahn

Solutions Collecting From Web of "SQLite – Можно ли вставить BLOB через инструкцию insert?"

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

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

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