개발 가이드

Local Navigation

BLOB 작업

사용자는 SQLite 데이터베이스에 대형 바이너리 객체를 포함시킬 수 있습니다. 크기가 1MB를 초과하는 객체에 대해 BLOB를 읽고 쓰려면 InputStreamOutputStream 객체를 사용해야 합니다. 이 기술을 사용하면 전체 BLOB가 메모리에 저장되는 문제를 방지할 수 있습니다. 입력 스트림 및 출력 스트림을 사용하지 않는 경우에는 사용할 수 있는 동적 메모리 양이 사용할 수 있는 BLOB 크기를 제한합니다.

BLOB에 데이터를 쓰려면 Database.createBlobOutputStream 메소드를 사용하여 OutputStream 객체를 만듭니다.

BLOB에 데이터를 쓰려면 Database.createBlobInputStream 메소드를 사용하여 InputStream 객체를 만듭니다.

Statement.bindZeroBlob 메소드를 사용하여 BLOB 출력을 위한 공간을 확보할 수 있습니다. 이 메소드는 문에서 일련의 null 바이트를 하나의 매개 변수로 연결합니다.

데이터베이스가 닫히기 전에 메모리를 소진하지 않도록 항상 명시적으로 BLOB를 닫아야 합니다.

주: 바이트 배열에서 작동하는 Statement.bind 메소드를 사용하거나 직접 BLOB를 SQL 문의 일부로 지정한 경우에는 메모리 부족 오류가 발생할 수 있습니다.

다음 샘플 코드는 테이블에 BLOB를 작성한 후 해당 테이블에서 BLOB를 읽습니다.

Database d = DatabaseFactory.openOrCreate("hello.db");
d.executeStatement( "CREATE TABLE IF NOT EXISTS t (a INTEGER PRIMARY KEY, b BLOB);" );
d.executeStatement( "INSERT INTO t(b) VALUES( ZEROBLOB( 1024 ) );" );
java.io.OutputStream outputStream = 
    d.createBlobOutputStream( "t", "b", d.lastInsertedRowID( ) );
for( int i = 0; i < 1024; ++i ) 
{
    outputStream.write( i % 128 );
}
outputStream.close( );
java.io.InputStream inputStream = 
    d.createBlobInputStream( "t", "b", d.lastInsertedRowID( ) );
for( int i = 0; i < 1024; ++i ) {
    if( i % 128 != inputStream.read( ) ) 
    {
        fail( "write and read mismatch" );
    }
}
inputStream.close( );
d.close();
이전 주제: pragma 사용

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.