2012-01-16 6 views
11

나는 안드로이드 애플리케이션을 개발 중이며 일부 비트 맵을 저장하기 위해 Sqlite 데이터베이스를 사용하고 있습니다. 사용자가 응용 프로그램을 설치할 때 일부 이미지가 자동으로 삽입되기를 원합니다.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')"}  

} 

도움이 될 것입니다.

들으, 툴리오 Zahn은 당신이 매우 긴 진수를 사용할 수 있습니다에 당신이 정말로, 정말로 원하는 경우

답변

16

리터럴 문자 BLOB으로 :

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 주입 공격을 피하기위한 확실한 방법이기 때문에 더 쉽고 명확합니다. 문자열을 함께 묶어서 SQL 쿼리를 어셈블하는 것은 피해야합니다.

+0

Humm, 귀하의 접근 방식은 확실히 흥미 롭습니다. 더 적은 수의 비트 맵이 아닌 수백 개의 비트 맵으로 데이터베이스를 미리 채울 필요가 있다면 더욱 그렇습니다. 이 경우에는 수백 가지의 insert 문을 사용하는 것은 매우 비실용적입니다. 나는 당신의 접근 방법을 테스트 할 것이지만, 우선 모든 이미지를 어디에 넣어야하는지의 문제에 대한 해결책을 찾아 내야한다. 그 중 많은 파일을 가지고있는 경우 드로어 블 폴더에 파일을 저장하는 것은 매우 비실용적입니다. – tulio84z

+1

프로젝트의 자산 디렉토리가 필요합니다. 파일에 액세스 할 수있는 API가 있습니다. 파일 시스템의 실제 파일 : http://developer.android.com/reference/android/content/res/AssetManager.html –

0

데이터 테이블에 보이지 않는단어가 있습니다. sqlite에 대한 navicat와 같은 db 도구로 db 파일을 확인하십시오. 표에있는 오류 단어에주의하십시오.

관련 문제