티스토리 뷰



안드로이드/Android Cursor를 이용한 DB 데이터 사용 하기 ~ !




안드로이드에서는 DB에서 가져온 데이터를 쉽게 처리하기 위해서 Cursor 라는 인터페이스를 제공해 줍니다. Cursor는 기본적으로 DB에서 값을 가져와서 마치 실제 Table의 한 행(Row), 한 행(Row) 을 참조하는 것 처럼 사용 할 수 있게 해 줍니다. 개발자는 마치 그 행(Row) 을 가지고 행(Row)에 있는 데이터를 가져다가 쓰는 것 처럼 사용하면 되는 편의성을 제공받게 됩니다.


1) 기본적인 DB 필드 구조.



 

Cursor는 SQLiteDatabase 에서 얻어오 실제 DB 값을 가지고 마치 테이블의 행(Row)를 하나하나 이동하며 참조하는듯 Data를 처리해 줍니다. 실제 Cursor의 동작은 이렇게 동작한다고 생각하시면 됩니다.


2) Cursor의 동작 원리 : 행(Row) 참조



실제 Cursor가 행(Row)를 참조하기 때문에 Cursor의 위치를 바꿔주는 메서드들이 존재 합니다. 실제 자주 사용하는 메서드들 입니다.


 메서드 

 동작 

 Cursor.moveToFirst();

 Cursor를 제일 첫번째 행(Row)으로 이동 시킨다.

 Cursor.moveToNext();

 Cursor를 다음 행(Row)으로 이동 시킨다.

 Cursor.moveToPrevious();

 Cursor를 이전 행(Row)으로 이동 시킨다.
 Cursor.moveToPosition(position);

 Cursor를 해당 Position 행(Row)으로 이동 시킨다.

 Cursor.moveToLast();

 Cursor를 마지막 행(Row)으로 이동 시킨다.



2-1) Cursor의 동작 원리 : 행(Row) 이동



위에서 실제 Cursor의 동작 원리를 살펴 보았는데요. 이번에는 Cursor가 참조하고 있는 DB 테이블의 행(Row) Data를 얻어오는 방법에 대해 알아 보겠습니다.



 메서드 

 동작 

 Cursor.getInt(), Cursor.getString(),   Cursor.getLong(), Cursor.getBoolean().....

 DB 테이블의 실제 Data를 가지고 옵니다.

 Cursor.getColumnIndex(Streing columnName);

 DB 테이블의 해당 필드(컬럼) 이름을 얻어 옵니다.

 Cursor.getPosition();

 Cursor가 가리키고 있는 DB 테이블 행(Row) Position 을 얻어 옵니다.

 Cursor.getColumnName(int columnIndex);

 필드(컬럼) index의 해당하는 필드(컬럼) 이름을 얻어 옵니다.

 Cursor.getCount();

 커서가 참조 할 수 있는 해당 테이블의 행(Row)의 갯수를 얻어 옵니다.

 Cursor.getColumnNames();

 DB 테이블의 필드(컬럼) 명을 순서대로 배열로 얻어 옵니다.

 Cursor.getColumnCount();

 DB 테이블의 필드(컬럼) 갯수를 얻어 옵니다.



3) Cursor로 값 가져오기

포스팅에서 언급하는 필드와 컬럼은 같은 개념으로 보시면 됩니다.


3-1) Cursor.getInt(), Cursor.getString(),   Cursor.getLong(), Cursor.getBoolean().....



3-2) Cursor.getColumnIndex(Streing columnName);



3-3) Cursor.getPosition();



3-4) Cursor.getColumnName(int columnIndex);



3-5) Cursor.getCount();



3-6) Cursor.getColumnNames();



3-7) Cursor.getColumnCount();




이렇게 해서 Cursor의 실제 동작 방법에 대해 알아 보았는데요. 어떠신가요?ㅎㅎ 이해가 잘 되시나요? 저는 그림 편집하느라 좀 시간이 걸렸네요. ^^; ㅎㅎ 아무튼 열심히 봐주셔서 감사하고 다음번 포스팅에서는 실제 Cursor의 사용법에 대해 알아보는 시간을 가져 보겠습니다. 



감사합니다.








댓글
  • 프로필사진 최용석 감사합니다 2013.04.25 12:07
  • 프로필사진 이건휘 안녕하세요.안드로이드에서 질문이 있습니다.
    public class intro extends Activity implements OnChildClickListener{

    MyDBHelper myDBHelper;

    ExpandableListView eList;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.nudle);

    //데이타베이스에서 내용을 읽어와서 daic 배열과, soc 배열내용을 채워준다.

    // SQLOpenHelper의 도움을 받아 데이타베이스와 테이블을 생성한다.
    myDBHelper = new MyDBHelper(this, "nuli.DB", null, 1);

    //sql 데이터 결과 얻기

    SQLiteDatabase db = myDBHelper.getReadableDatabase();

    String sql;

    //Log.i("SQLiteTest1", "길이:" + searchWord.length());


    sql = "SELECT daic, count(*) FROM nudle GROUP BY daic;";


    Log.i("nudleTest1", sql);
    Cursor cursor;
    Cursor cursor1;

    cursor = db.rawQuery(sql, null);


    //그룹데이터
    //String daic[];

    //그룹 상세데이타
    //String soc[][];

    //그룹데이터
    String daic[] = new String[8];
    int countArr[] = new int[8];
    int k=0;
    while(cursor.moveToNext()){
    daic[k] = cursor.getString(0);
    countArr[k] = cursor.getInt(1);
    Log.i("nudleTest1", daic[k] + " " + countArr[k]);
    k++;
    }


    //그룹 상세데이타
    //String soc[][] = new String[10][10];


    for( int i = 0; i< daic.length; i++){
    String category = daic[i];

    String sql1;

    sql1 = "SELECT soc FROM nudle WHERE daic = '" + category + "';";

    Log.i("nudleTest1", sql1);


    cursor1 = db.rawQuery(sql1, null);
    //실행시킨 커서 객체를

    String soc[][] = new String[i][10];
    int countArr1[][] = new int[i][10];

    int v = 0;

    while(cursor1.moveToNext()){
    for( int u = 0; u< daic.length; u++){
    String category2 = soc[i][v];
    //i행 v열에 값기억
    String sql2;

    sql2 = "SELECT soc FROM nudle WHERE daic = '" + category + "';";

    Log.i("nudleTest2", sql2);
    //soc배열 i행과 v열
    soc[i][v] = cursor1.getString(0);
    Log.i("nudleTest3", soc[i][v]);

    //u는 0이고 u가 대카테고리의 길이보다 작은동안 u는 늘어난다.


    v++;
    }
    }
    }

    }
    이 라는 부분을 만들고 있습니다. ExpandableListView에 넣으려고 daic[],soc[][] 를 선언했는데 sql에서 daic부분에는 제가 원하는 부분이
    들어가는데 soc 부분에는 들어가지 않아서 질문을 드립니다.

    05-23 15:59:17.791: W/ActivityThread(1901): Application com.jica.nudle is waiting for the debugger on port 8100...
    05-23 15:59:17.841: I/System.out(1901): Sending WAIT chunk
    05-23 15:59:17.862: I/dalvikvm(1901): Debugger is active
    05-23 15:59:18.041: I/System.out(1901): Debugger has connected
    05-23 15:59:18.052: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.251: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.451: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.651: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.851: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.051: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.296: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.491: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.691: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.929: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:20.133: I/System.out(1901): debugger has settled (1392)
    05-23 15:59:21.751: D/gralloc_goldfish(1901): Emulator without GPU emulation detected.
    05-23 15:59:24.951: I/nudleTest1(1901): SELECT daic, count(*) FROM nudle GROUP BY daic;
    05-23 15:59:24.971: I/nudleTest1(1901): 국수 2
    05-23 15:59:24.981: I/nudleTest1(1901): 라면 3
    05-23 15:59:24.981: I/nudleTest1(1901): 컵라면 3
    05-23 15:59:24.981: I/nudleTest1(1901): 파스타 2
    05-23 15:59:24.981: I/nudleTest1(1901): SELECT soc FROM nudle WHERE daic = '국수';
    로그인데 daic에 포함된 soc 부분이 나오지 않고 여기서 디버깅이 멈추네요. 부탁드립니다.
    wnsrjs23@naver.com으로 부탁드려도 될까요?
    2013.05.23 16:05
  • 프로필사진 레나 좋은 정보 감사합니다 2013.06.11 13:58
  • 프로필사진 키모 그림이 깔끔하고 이해하기 쉽네요 2013.07.24 11:04
  • 프로필사진 카인 감사합니다.
    개인공부용으로(비공개) 좀 퍼갈께요
    2013.07.28 17:45
  • 프로필사진 preston7 정말 잘봤습니다. 그림으로 설명해 주시니 이해가 잘되네요 2013.09.03 10:33
  • 프로필사진 igusl 많은 도움 되었습니다. 감사합니다. 2014.02.22 23:06
  • 프로필사진 몽블랑 정말 이해가 잘 되었습니다. 만드시느라 수고하셨습니다!! 감사합니다^^. 2014.10.18 21:22
  • 프로필사진 이채리 와 진짜 이해가 잘 됐습니다ㅠㅠ 수고하셨어요 방법 잘 알고갑니다! 2014.11.18 15:22
  • 프로필사진 chris 정말 깔끔하게 잘 정리 해주셨네요 정말 감사합니다^^ 이해도 바로바로 되고 응용하는데도 걱정 없었네요 ㅎ
    좋은 하루되세요
    2014.11.28 19:18
  • 프로필사진 궁금이 감사합니다.~~~~ ^_^ 2014.12.02 14:42
  • 프로필사진 예쁜꽃이피었으면 감사합니다~ 담아갈게요~ 2015.04.28 11:11 신고
  • 프로필사진 호레 이해 잘되었네요 감사합니다~

    담아갈게요!
    2016.01.25 13:26 신고
  • 프로필사진 HandyKim 감사합니다^^
    정리를 잘 하셔서 도움이 많이 됩니다 ㅎㅎ
    2016.06.08 17:35 신고
  • 프로필사진 김병희 깔끔하게 정리하신 데 항상 감탄하고 잘 보고 갑니다.
    감사합니다.
    2017.03.24 06:42
  • 프로필사진 Creaby 참고한 부분이 있어서 출처남기고 퍼갈께요'' 2017.07.24 16:47 신고
댓글쓰기 폼