SQLite – ¿Es posible insertar un BLOB a través de la instrucción insert?

Estoy desarrollando una aplicación de Android y estoy usando una base de datos Sqlite para almacenar algunos mapas de bits. Quiero que algunas imágenes se inserten automáticamente cuando el usuario instala la aplicación.

Estoy usando la clase SQLiteOpenHelper como esta:

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]); } } } 

Quiero pasar una constante al parámetro scriptSQLCreate mostrado arriba que sería así:

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

Cualquier ayuda será muy apreciada,

Thx, Tulio Zahn

Si realmente quieres, puedes usar un literal hexagonal muy largo como un literal de blob:

 insert into memes(img, name) values(X'0102030405060708090a0b0c0d0e0f', '1.jpg') 

Sin embargo, esto suele ser una mala idea; En su lugar, vea las consultas parametrizadas . Ellos le permiten compilar una declaración una vez utilizando marcadores de posición en lugar de valores reales y, a continuación, reutilizarlo muchas veces, rellenando los marcadores de posición según sea necesario:

 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(); 

(Advertencia — código no probado.)

En general, debe estar utilizando consultas parametrizadas en todas partes , ya que son una manera segura de evitar ataques de inyección de SQL, además suelen ser más fácil y más claro. El ensamblaje de consultas SQL mediante encolado de cadenas debe evitarse a toda costa.

Su tabla de datos tiene alguna palabra invisible que no puede ver. Compruebe su archivo db con las herramientas de db como navicat para sqlite. Preste atención a la palabra de error en la tabla.

  • Android - Contenido Valores sobre la escritura de filas existentes
  • Tablas de muestra Android sqlite
  • Navegador de base de datos SQLite con Android
  • Android Sqlite IN, sin sintaxis
  • Mejor manera de acceder a la base de datos en la aplicación multi-threaded Android?
  • Android: ¿Dónde se almacenan los archivos de base de datos?
  • RxJava2 en la función de devolución de llamada onLoadFinished de CursorLoader
  • Cómo probar la actualización de la base de datos sqlite antes de cargar la nueva versión de mi aplicación en la tienda de juegos en android
  • Excepción Sqlite, error de sintaxis
  • Java.sql.SQLException: No se puede ejecutar insert stmt en objeto
  • Jest error de caso de prueba en reactivo nativo mediante el complemento externo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.