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.

  • Cambiar el nombre de SQLite Database
  • Android Lollipop - comportamiento cambiado de SQLite
  • Seleccione al menos uno de cada categoría?
  • ActiveAndroid Excepción SQLite 'No such table'
  • Versión de SQLite utilizada en Android?
  • Cursor while loop devuelve cada valor pero el último
  • Android: ¿Cómo acceder a los resultados de Cursor cuando INNER JOIN se realiza?
  • Obtención del siguiente valor AUTO_INCREMENT de una base de datos SQLite
  • ¿Cualesquiera buenas herramientas de ORM para el desarrollo de Android?
  • Leer datos de sqlite cuando se está ejecutando una transacción (Android)
  • Cómo quitar filas consecutivas con datos duplicados en ciertos campos (en SQLite)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.