개발 가이드

Local Navigation

테이블 데이터 검색

SELECT 문과 같이 결과 세트를 반환하는 쿼리를 실행하려면 Statement.getCursor 메소드를 사용해야 합니다.

커서는 결과 세트를 가지고 있는 임시 테이블입니다. 커서가 닫히면 임시 테이블은 삭제됩니다.

Cursor 인터페이스는 커서에 대한 읽기 전용 액세스를 제공합니다. 커서는 영구 테이블과 동일하게 쿼리될 수 있습니다. 커서 열은 후속 쿼리로 전달된 열 객체에 의해 참조될 수 있습니다.

Cursor 인터페이스의 기본 구현이 데이터를 캐시하지 않으므로 앞으로만 이동하는 단방향 탐색을 제공합니다. 현재 행 앞의 행으로 탐색하려고 시도하면 DatabaseException을 반환합니다.

BufferedCursor 클래스는 메모리의 커서 데이터를 캐시하며 양방향의 임의 데이터 액세스를 제공하지만 처리할 수 있는 데이터 양에는 제한이 있습니다. 대형 결과 세트에서 사용된 경우 버퍼링된 커서에서 OutOfMemoryError를 throw할 수도 있습니다.

기본적으로 한 번에 하나의 행이 버퍼링됩니다. 커서가 버퍼링된 세트에서 이동할 경우 일련의 새 행들을 자동으로 가져옵니다. 성능을 향상시키기 위해 버퍼 크기를 1보다 큰 값으로 올리고자 할 수 있습니다. Statement.setCursorBufferSize 메소드를 사용하면 한 번에 버퍼링될 행의 수를 지정할 수 있습니다.

하나의 커서에서 버퍼링될 수 있는 데이터 한도는 1MB입니다. 대부분의 경우 이 한도라면 충분합니다. 한도를 초과할 것으로 예상된다면 여러 쿼리를 사용하여 더 작은 결과 세트를 만들 수 있습니다. 예를 들어 SELECT 문에서 어느 열을 반환할지 지정할 수 있습니다. 한도를 초과하는 경우 setCursorBufferSize가 너무 높게 설정되지 않았는지 확인해야 합니다.

쿼리하는 행에 BLOB가 포함되어 있다면 createBlobInputStream 메소드를 사용하여 크기 한도가 없는 InputStream 객체를 만들 수 있습니다. InputStream 객체를 사용하는 경우에는 결과 세트의 한도가 1MB로 설정되지 않습니다.

데이터 검색이 느린 경우 커버링 인덱스를 만들어 보십시오. 커버링 인덱스는 쿼리에서 참조되는 모든 열을 포함합니다.

코드 샘플: 테이블 데이터 검색

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
public class ReadData extends UiApplication
{
    public static void main(String[] args)
    {
        ReadData theApp = new ReadData();
        theApp.enterEventDispatcher();
    }
    public ReadData()
    {
        pushScreen(new ReadDataScreen());
    }   
}
class ReadDataScreen extends MainScreen
{
    Database d;
    public ReadDataScreen()
    {
        LabelField title = new LabelField("SQLite Read Table Data Sample",
                                           LabelField.ELLIPSIS | 
                                           LabelField.USE_ALL_WIDTH);
        setTitle(title);
        add(new RichTextField("Attempting to retrieve data from " + 
                              "MyTestDatabase.db on the SDCard."));
        try
        {
            URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
                                   "MyTestDatabase.db"); 
            d = DatabaseFactory.open(myURI);
            Statement st = d.createStatement("SELECT Name,Age FROM People");
            st.prepare();
            Cursor c = st.getCursor();
            Row r;
            int i = 0;
            while(c.next()) 
            {
                r = c.getRow();
                i++;
                add(new RichTextField(i + ". Name = " + r.getString(0) +
                                          " , " +
                                          "Age = " + r.getInteger(1)));
            }
            if (i==0)
            {
                add(new RichTextField("No data in the People table."));
            }
            st.close();
            d.close();
        }
        catch ( Exception e ) 
        {         
            System.out.println( e.getMessage() );
            e.printStackTrace();
        }          
    }
}
다음 주제: 트랜잭션 사용
이전 주제: BLOB 작업

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