2012-01-16 11 views
11

मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं और मैं कुछ बिटमैप्स स्टोर करने के लिए एक स्क्लाइट डेटाबेस का उपयोग कर रहा हूं। जब उपयोगकर्ता एप्लिकेशन इंस्टॉल करता है तो मैं कुछ छवियों को स्वचालित रूप से सम्मिलित करना चाहता हूं।SQLite - क्या सम्मिलन कथन के माध्यम से एक BLOB डालना संभव है?

मैं इस तरह SQLiteOpenHelper वर्ग का उपयोग कर रहा:

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

...

मैं scriptSQLCreate पैरामीटर कि ऊपर दिखाए गए एक निरंतर पारित करने के लिए तो जैसा होगा चाहते हैं:

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

} 

किसी भी मदद की बहुत सराहना की जाएगी,

Thx, तुलियो Zahn

उत्तर

16

यदि आप वास्तव में, वास्तव में आप एक बहुत लंबे हेक्स उपयोग कर सकते हैं करना चाहते हैं शाब्दिक एक ब्लॉब शाब्दिक रूप में:

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

बहरहाल, यह आमतौर पर एक बुरा विचार है, इसके बजाय, parameterised queries पर जाएं। (कोड का परीक्षण नहीं किया चेतावनी ---।)

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

: वे आप आवश्यकतानुसार एक बयान एक बार संकलन वास्तविक मान के स्थान पर प्लेसहोल्डर का उपयोग कर दूँगी, और फिर इसे पुन: उपयोग में कई बार, प्लेसहोल्डर में भरने आम तौर पर आपको पैरामीटरयुक्त प्रश्न हर जगह का उपयोग करना चाहिए, क्योंकि वे SQL इंजेक्शन हमलों से बचने के लिए एक निश्चित-अग्नि मार्ग हैं, साथ ही आमतौर पर आसान और स्पष्ट होते हैं। स्ट्रिंग्स को ग्लूइंग करके एसक्यूएल प्रश्नों को इकट्ठा करना हर कीमत से बचा जाना चाहिए।

+0

हम, आपका दृष्टिकोण निश्चित रूप से दिलचस्प है। और भी कुछ अगर किसी को कुछ ही जगहों के बजाय सैकड़ों बिटमैप्स के साथ डेटाबेस को पूर्ववत करने की आवश्यकता है। उस स्थिति में सैकड़ों सम्मिलित बयानों के लिए यह बहुत अव्यवहारिक हो जाता है। मैं आपके दृष्टिकोण का परीक्षण करूंगा लेकिन पहले मुझे उन सभी छवियों को कहां रखना है, इस समस्या के समाधान के साथ आना चाहिए। उनमें से बहुत से होने के मामले में, उन्हें केवल खींचने योग्य फ़ोल्डर में डालने के लिए बहुत अव्यवहारिक लगता है – tulio84z

+1

आप जो चाहते हैं वह आपकी परियोजना में संपत्ति निर्देशिका है --- एक एपीआई है जो आपको फाइलों तक पहुंचने देगी जैसे कि वे ' फाइल सिस्टम पर वास्तविक फाइलें: http://developer.android.com/reference/android/content/res/AssetManager.html –

0

आपकी डेटा तालिका में कुछ अदृश्य शब्द है जिसे आप नहीं देख सकते हैं। एसबीएलआईटी के लिए नेविटैट जैसे डीबी टूल्स के साथ अपनी डीबी फाइल देखें। कृपया तालिका में त्रुटि शब्द पर ध्यान दें।

संबंधित मुद्दे