2012-01-16 17 views
11

Sto sviluppando un'applicazione Android e sto utilizzando un database Sqlite per archiviare alcuni bitmap. Voglio che alcune immagini vengano automaticamente inserite quando l'utente installa l'applicazione.SQLite - È possibile inserire un BLOB tramite istruzione di inserimento?

Sto utilizzando la classeSQLiteOpenHelper come questo:

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

...

voglio passare una costante per il parametro scriptSQLCreate mostrato sopra che sarebbe in questo modo:

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

} 

Qualsiasi aiuto sarà molto apprezzato,

Thx, Tulio Zahn

risposta

16

Se davvero, vuole veramente è possibile utilizzare un tempo molto lungo esagonale letterale come un blob letterale:

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

Tuttavia, questo di solito è una cattiva idea; invece, vai a guardare parameterised queries. Essi vi permetterà di compilare una dichiarazione volta usando segnaposti al posto dei valori attuali, e poi riutilizzarlo più volte, compilando i segnaposto in base alle esigenze:

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

(Attenzione --- codice non testato.)

In generale dovresti utilizzare query parametrizzate ovunque, in quanto sono un modo infallibile per evitare attacchi SQL injection, in più sono in genere più semplici e più chiare. L'assemblaggio di query SQL incollando insieme le stringhe dovrebbe essere evitato a tutti i costi.

+0

Humm, il tuo approccio è decisamente interessante. Ancor più se si ha bisogno di prepopolare un database con centinaia di bitmap invece di pochi. In tal caso diventa molto poco pratico avere centinaia di istruzioni di inserimento. Metterò alla prova il tuo approccio, ma prima devo trovare una soluzione al problema di dove mettere tutte quelle immagini. Nel caso di averne molti, solo metterli nella cartella drawable sembra molto poco pratico – tulio84z

+1

Quello che vuoi è la directory assets nel tuo progetto --- c'è un'API che ti permetterà di accedere ai file lì come se fossero " re file reali sul filesystem: http://developer.android.com/reference/android/content/res/AssetManager.html –

0

La tabella dei dati contiene una parola invisibile che non è possibile visualizzare. Controlla il tuo file db con gli strumenti db come navicat per sqlite. Si prega di prestare attenzione alla parola di errore nella tabella.

Problemi correlati