지난 글에 이어서 데이터 조회하는 코드를 작성할 것이다. 프로젝트 파일을 이어서 사용한다.

 

11장 - 헬퍼 클래스 : 스키마 업그레이드

헬퍼(Helper) 클래스 : 스키마를 업그레이드 할 때 사용하기 좋은 클래스.스키마 : 테이블의 구조를 정의한 것 이미 테이블 안에 데이터가 존재한다면, 스키마를 수정할 때 데이터의 손실이 일어

sand-to-desert.tistory.com

 

0️⃣핵심🔥

데이터베이스 사용순서

  1. 데이터베이스 만들기 : openOrCreateDatabase()  →  SQLiteDatabase 객체가 반환됨.
  2. 테이블 만들기 : execSQL()     'CREATE TABLE ...'
  3. 레코드 추가하기 : execSQL()    'INSERT INTO ...'
  4. 데이터 조회하기 : rawQuery()    'SELECT FROM ...'    Cursor 객체가 반환됨.

 

1️⃣activity_main.xml

살짝 수정.

 

 

 

 

 

2️⃣DatabaseHelper 수정 (살짝만 수정함)

더보기
package com.example.chapter11_3;

public class DatabaseHelper extends SQLiteOpenHelper {
    //public static String name = "employee.db";
    public static String tbName = "emp";
    public static int version = 1;

    public DatabaseHelper(@Nullable Context context, String name) {
        super(context, name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table if not exists " + tbName + "(" + " _id integer PRIMARY KEY autoincrement, "
                + " name text, " + " age integer, " + " mobile text)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if(newVersion>1){
            db.execSQL("DROP TABLE IF EXISTS "+tbName);
        }
    }
}

 

 

 

 

 

3️⃣MainActivity.java

package com.example.chapter11_3;

public class MainActivity extends AppCompatActivity {

    EditText editText_DB, editText_TB;
    TextView textView;
    SQLiteDatabase database;
    DatabaseHelper dbHelper;

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

        editText_DB = findViewById(R.id.editTextText);
        //editText_TB = findViewById(R.id.editTextText2);
        textView = findViewById(R.id.textView);

        Button button_DB = findViewById(R.id.button);
        button_DB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { // 데이터베이스 생성
                textView.append("데이터베이스 & 테이블 생성 시작\n");
                String dbName = editText_DB.getText().toString();

                dbHelper = new DatabaseHelper(getApplicationContext(), dbName);
                database = dbHelper.getWritableDatabase();
                textView.append("데이터베이스 & 테이블 생성 완료" + dbName + "\n");

                // 레코드 추가
                textView.append("레코드 추가 시작\n");

                database.execSQL("insert into " + "emp" + "(name, age, mobile)"+
                        "values" + "('Sheldon', 26, '010-3141-5926')");
                database.execSQL("insert into " + "emp" + "(name, age, mobile)"+
                        "values" + "('Penny', 26, '010-3141-5926')");
                database.execSQL("insert into " + "emp" + "(name, age, mobile)"+
                        "values" + "('Leonard', 26, '010-3141-5926')");
                textView.append("레코드 추가 완료\n");
            }
        });

        Button button_CK = findViewById(R.id.button3);
        button_CK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.append("데이터 호출 시작\n");

                Cursor cursor = database.rawQuery("select _id, name, age, mobile from emp", null);
                // executeSQL : 결과값이 없는 SQL 실행 방법
                // rawQuery : 결과값을 Cursor 객체로 받을 수 있는 SQL 실행 방법
                
                int recordCount = cursor.getCount();
                textView.append("레코드 개수 : "+recordCount+"\n");

                for(int i=0;i<recordCount;i++){
                    cursor.moveToNext(); // while문을 사용할 경우 moveToNext가 false를 반환할 때까지 반복하는 형식으로 사용.

                    int id = cursor.getInt(0);
                    String name = cursor.getString(1);
                    int age = cursor.getInt(2);
                    String mobile = cursor.getString(3);

                    textView.append("레코드 #"+i+" : "+id+", "+name+", "+age+", "+mobile+"\n");
                }
                cursor.close();
            }
        });
    }
}

 

cursor 객체에 사용할 수 있는 메서드

int getColumnCount ()
int getColumnIndex (String columnName)
String[] getColumnNames () String getColumnName (int columnIndex)
 
int getCount () boolean moveToNext ()
boolean moveToPrevious ()
boolean moveToFirst ()
boolean moveToLast ()
boolean move (int offset)
String getString (int columnIndex)
short getShort (int columnIndex)
int getInt (int columnIndex)
long getLong (int columnIndex)
float getFloat (int columnIndex)
double getDouble (int columnIndex)
byte[] getBlob (int columnIndex)

 

 

 

 

 

4️⃣에러

레코드의 개수가 처음에 3개가 나와야하는데, 4개가 나오는거다. 이상해서 앱을 다시 실행했더니 7개가 되었다.

'데이터베이스랑 테이블 만들기' 버튼을 누를 때마다, 레코드가 생성되는 것이었다.

 

게다가 처음엔 레코드 추가에서 전화번호 값을 '010-3141-5926'으로 안 넣고 010-3141-5926으로 넣었더니, 정수형으로 들어가버림. 그래서 10 - 3141 - 5926 = -9057 이라는 값이 들어감. (처음엔 -9057이 무슨 에러코드지? 했는데 걍.. 내 실수.)

 

앱을 아예 제거한 뒤 다시 시작했더니 제대로 동작함.

 

5️⃣실행 결과