2012-01-16 24 views
11

Bir Android uygulaması geliştiriyorum ve bazı bitmap'leri depolamak için bir Sqlite veritabanı kullanıyorum. Kullanıcı uygulamayı yüklediğinde bazı resimlerin otomatik olarak eklenmesini istiyorum.SQLite - insert ifadesi ile bir BLOB eklemek mümkün mü?

böyle SQLiteOpenHelper sınıfını kullanıyorum:

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

...

ben şöyle olacağını yukarıda gösterilen scriptSQLCreate parametresine sabit geçmek istiyorum:

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

} 

Herhangi bir yardım çok apreciated olacak

Thx, Tulio Zahn çok uzun onaltılık kullanabilirsiniz etmek gerçekten, gerçekten istiyorsanız

cevap

16

literal değişmez bir damla gibi:

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

Ancak bu genellikle kötü bir fikir; bunun yerine, parameterised queries'a bakın. Gerektiğinde Onlar tutucuları doldurarak, birçok kez yeniden kullanmak sonra yerine gerçek değerlerin yer tutucular kullanılarak kez bir açıklama derlemek izin ve olur:

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

(Uyarı --- kod test edilmedi.)

Genelde, her yerde parametreli sorgulamaları kullanmalısınız, çünkü SQL enjeksiyon saldırılarını önlemek için emin bir yoldur, artı genellikle daha kolay ve daha nettir. SQL sorgularını bir araya getirerek dizeleri birbirine yapıştırmaktan kaçınılmalıdır.

+0

Humm, yaklaşımınız kesinlikle ilginç. Bir veritabanını sadece birkaçının yerine yüzlerce bitmap ile önceden doldurması gerekiyorsa daha da fazla. Bu durumda yüzlerce ekleme ifadesi olması çok pratik değildir. Yaklaşımını test edeceğim ama önce bütün bu görüntüleri yerleştirmek için bir çözüm bulmak zorundayım. Bunların birçoğuna sahip olmanız durumunda, sadece çekilebilir klasöre yerleştirmek çok pratik değildir. – tulio84z

+1

İstediğiniz şey, projenizdeki varlıklar dizinidir --- orada dosyalara erişmenizi sağlayacak bir API vardır. dosya sistemindeki gerçek dosyalar: http://developer.android.com/reference/android/content/res/AssetManager.html –

0

Veri tablonuzda göremediğiniz bazı görünmez sözcük bulunmaktadır. Sqlite için navicat gibi db araçları ile db dosyanızı kontrol edin. Lütfen tablodaki hata kelimesine dikkat edin.

İlgili konular