http://arabiannight.tistory.com/category/Android



안드로이드에서는 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의 사용법에 대해 알아보는 시간을 가져 보겠습니다. 



감사합니다.





저작자 표시 비영리 변경 금지
  1. 최용석
    감사합니다
  2. 이건휘
    안녕하세요.안드로이드에서 질문이 있습니다.
    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으로 부탁드려도 될까요?
  3. 레나
    좋은 정보 감사합니다
  4. 키모
    그림이 깔끔하고 이해하기 쉽네요
  5. 카인
    감사합니다.
    개인공부용으로(비공개) 좀 퍼갈께요
  6. preston7
    정말 잘봤습니다. 그림으로 설명해 주시니 이해가 잘되네요

 NAME __

 PASSWORD __

 LINK (YOUR WEBSITE)

COMMENT

 SECRET | 비밀글로 남기기

안드로이드/Android adb로 DB 확인 하기 ~!안드로이드/Android adb로 DB 확인 하기 ~!

POSTED AT 2013/03/01 17:15 | POSTED IN ANDROID/ADB

안드로이드/Android adb로 DB 확인 하기 ~!




adb로 DB 확인 하는 방법 입니다. 일단 안드로이드 환경변수(Path) 가 설정 되어 있어야 adb shell을 전역적으로 이용할 수 있습니다. 환경변수(Path) 를 설정하는 방법은 [안드로이드/Android 환경변수(Path) 설정 하기를 참고 하시기 바랍니다.



c:\> adb shell

# cd data/data/package명/databases

# sqlite3 DB명.db (DB에 접근이 안될경우 "# su" (관리자 권한 획득) 을 해주시기 바랍니다.)

# ls (검색 == dir)


> select * from table명;

> select _id, name from table명;

> ctrl + c (중지) : c:\>로 돌아감




"# sqlite3 DB명.db" 명령어 실행시 아래의 에러가 난다면 아래의 블로그를 참고 하시기 바랍니다.

 > sqlite3 not found error 

http://blog.naver.com/PostView.nhn?blogId=calistan&logNo=60168981067





저작자 표시 비영리 변경 금지

 NAME __

 PASSWORD __

 LINK (YOUR WEBSITE)

COMMENT

 SECRET | 비밀글로 남기기

안드로이드/Android 키보드 Show / Hide 시키기 ~!안드로이드/Android 키보드 Show / Hide 시키기 ~!

POSTED AT 2013/03/01 17:01 | POSTED IN ANDROID/키보드


 < 개발 환경 >  
   작성일 : 2013.03.01
   OS 설치 버전 : Windows7 32bit  
   SDK 설치 버전 : 안드로이드 SDK 4.2 (젤리빈) / API LEVEL : 17  
   ADT 설치 버전 : 21   
   Java 설치 버전 : JDK 1.6.0_20 / JRE6 
   이클립스 설치 버전 : Indigo
   테스트단말 : 삼성 갤럭시 S2 4.0.4 (아이스크램 샌드위치)   

 < 프로젝트 적용 > 
   Android Build Target / API LEVEL / Complie With : 10  
   minSdkVersion : 7 
   targetSdkVersion : 7 
   Java Compiler Level : 1.6  
   Text file encoding : UTF-8




안드로이드/Android 키보드 Show / Hide 시키기 ~!




안드로이드에서 소프트 키보드 Show / Hide 시키는 방법 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
public boolean hideSoftInputWindow(View edit_view, boolean bState) {
         
        InputMethodManager imm = (InputMethodManager) getSystemService
                (Context.INPUT_METHOD_SERVICE);
         
        if ( bState )
            return imm.showSoftInput(edit_view, 0);
        else
            return imm.hideSoftInputFromWindow
                    (edit_view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
             
    }




저작자 표시 비영리 변경 금지

 NAME __

 PASSWORD __

 LINK (YOUR WEBSITE)

COMMENT

 SECRET | 비밀글로 남기기

안드로이드/Android ListView 클릭시 색상(배경) 변경 하기 ~!안드로이드/Android ListView 클릭시 색상(배경) 변경 하기 ~!

POSTED AT 2013/02/26 02:16 | POSTED IN ANDROID/LISTVIEW

안드로이드/Android ListView 클릭시 색상(배경) 변경 하기 ~!




안드로이드 ListView 클릭시 색상(배경)을 변경하는 방법 입니다. ListView가 기본 제공해 주는 Selector 말고 사용자가 지정하는 색상 및 Selector를 사용 할 수 있습니다.





1.xml파일에서 변경하는 법

   - listview의 옵션에 android:listSelector="#00000000"

 

2.소스에서 변경하는 법

 - m_listView.setSelector( new PaintDrawable( 0xffff0000 )  ) ;

 

* 그림 파일로 변경할 수도 있음

*주의 할 점은 리스트 아이템의 배경이 그림파일이면 복잡해진다는거..우히히

 

3.예전에 쓰던 방법인데 리스트뷰와 똑같이 생기고 색이 다른 그림파일을 준비한다.

  그리고 다음과 같이 xml파일을 만들고 이 파일의 이름을 백그라운드로 깔면된다. (리스트뷰아이템, 버튼 등 다 적용됨)

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="false" android:state_pressed="true"

        android:drawable="@drawable/list_01_on" />

    <item android:drawable="@drawable/list_01" />

</selector>