Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLite - Is it possible to insert a BLOB via insert statement?

I'm developing an Android application and i'm using a Sqlite database to store some bitmaps. I want some images to be automatically inserted when the user installs the application.

I'm using the SQLiteOpenHelper class like this:

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

...

I want to pass a constant to the scriptSQLCreate parameter shown above that would be like so:

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

}

Any help will be much apreciated,

Thx, Tulio Zahn

like image 424
tulio84z Avatar asked Jan 16 '12 17:01

tulio84z


People also ask

Can we INSERT BLOB in SQL?

The database server provides SQL functions that you can call from within an INSERT statement to import and export BLOB or CLOB data, otherwise known as smart large objects. For a description of these functions, see Smart large object functions.

Can SQLite store BLOBs?

A BLOB (large binary object) is an SQLite data type that stores large objects, typically large files such as images, music, videos, documents, pdf, etc. We need to convert our files and images into binary data (byte array in Python) to store it into SQLite database.

What does BLOB mean in SQLite?

BLOB stands for a binary large object that is a collection of binary data stored as a value in the database. By using the BLOB, you can store the documents, images, and other multimedia files in the database. We will create a new table named documents for the sake of demonstration.


1 Answers

If you really, really want to you can use a very long hex literal as a blob literal:

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

However, this is usually a bad idea; instead, go look at parameterised queries. They will let you compile a statement once using placeholders instead of actual values, and then reuse it many times, filling in the placeholders as needed:

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

(Warning --- code not tested.)

In general you should be using parameterised queries everywhere, as they're a sure-fire way to avoid SQL injection attacks, plus are usually easier and clearer. Assembling SQL queries by glueing strings together should be avoided at all costs.

like image 74
David Given Avatar answered Sep 21 '22 14:09

David Given