2012-01-16 36 views
11

Tôi đang phát triển một ứng dụng Android và tôi đang sử dụng cơ sở dữ liệu Sqlite để lưu trữ một số bitmap. Tôi muốn một số hình ảnh được chèn tự động khi người dùng cài đặt ứng dụng.SQLite - Có thể chèn BLOB qua câu lệnh chèn không?

Tôi đang sử dụng lớp SQLiteOpenHelper như thế này:

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

...

Tôi muốn vượt qua một hằng số với tham số scriptSQLCreate hiển thị ở trên đó sẽ là như vậy:

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

} 

Bất kỳ trợ giúp nào sẽ được đánh giá cao,

Thx, Tulio Zahn

Trả lời

16

Nếu bạn thực sự, thực sự muốn bạn có thể sử dụng một hex rất dài đen như một đốm đen:

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

Tuy nhiên, điều này thường là một ý tưởng tồi; thay vào đó, hãy xem parameterised queries. Họ sẽ cho phép bạn biên dịch một tuyên bố một lần sử dụng placeholders thay vì giá trị thực tế, và sau đó tái sử dụng nó nhiều lần, điền vào placeholders khi cần thiết:

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 --- mã không được kiểm tra.)

Nói chung, bạn nên sử dụng các truy vấn được tham số ở mọi nơi, vì chúng là cách chắc chắn để tránh các cuộc tấn công SQL injection, cộng với thường dễ dàng hơn và rõ ràng hơn. Việc lắp ráp các truy vấn SQL bằng cách dán các chuỗi lại với nhau nên tránh bằng mọi giá.

+0

Humm, cách tiếp cận của bạn chắc chắn là thú vị. Thậm chí nhiều hơn nếu người ta cần phải chuẩn bị sẵn một cơ sở dữ liệu với hàng trăm bitmap thay vì chỉ một vài. Trong trường hợp đó, sẽ rất không thực tế khi có hàng trăm câu lệnh chèn. Tôi sẽ kiểm tra cách tiếp cận của bạn nhưng trước tiên tôi phải đưa ra một giải pháp cho vấn đề về nơi để đặt tất cả những hình ảnh đó. Trong trường hợp có rất nhiều người trong số họ, chỉ cần đặt chúng trong thư mục drawable có vẻ rất không thực tế. – tulio84z

+1

Điều bạn muốn là thư mục nội dung trong dự án của mình --- có API cho phép bạn truy cập các tệp ở đó như thể chúng các tệp thực sự trên hệ thống tệp: http://developer.android.com/reference/android/content/res/AssetManager.html –

0

Bảng dữ liệu của bạn có một số từ vô hình mà bạn không thể nhìn thấy. Kiểm tra tệp db của bạn bằng các công cụ db như navicat cho sqlite. Hãy chú ý đến từ lỗi trong bảng.

Các vấn đề liên quan