2012-01-16 6 views
11

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.SQLite - ¿Es posible insertar un BLOB a través de una declaración de inserción?

estoy usando el clase SQLiteOpenHelper así:

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 para el parámetro scriptSQLCreate mostrado anteriormente que sería de esta manera:

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

Respuesta

16

Si realmente, realmente desea puede utilizar un tiempo muy largo hexagonal literal como una mancha literal:

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

Sin embargo, esto suele ser una mala idea; en su lugar, ve a parameterised queries. Que le permitirá compilar una declaración de una vez usando marcadores de posición en lugar de los valores reales, y luego volver a utilizar muchas veces, llenando 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, debería utilizar las consultas parametrizadas en todas partes, ya que son una forma segura de evitar los ataques de inyección de SQL, además son generalmente más fáciles y claras. El ensamblaje de consultas SQL pegando cadenas se debe evitar a toda costa.

+0

Humm, su enfoque es definitivamente interesante. Aún más si se necesita llenar previamente una base de datos con cientos de mapas de bits en lugar de solo unos pocos. En ese caso, es muy poco práctico tener cientos de instrucciones de inserción. Probaré su enfoque, pero primero debo encontrar una solución al problema de dónde colocar todas esas imágenes. En el caso de tener muchos de ellos, simplemente ponerlos en la carpeta dibujable también parece muy poco práctico – tulio84z

+1

Lo que quiere es el directorio de activos en su proyecto --- hay una API que le permitirá acceder a los archivos allí como si ' re archivos reales en el sistema de archivos: http://developer.android.com/reference/android/content/res/AssetManager.html –

0

Su tabla de datos tiene un palabra invisible que no se puede ver. Verifica tu archivo db con las herramientas db como navicat para sqlite. Por favor, preste atención a la palabra de error en la tabla.

Cuestiones relacionadas