android-lecture

android lecture notes

View on GitHub

layout: true .top-line[]


class: center, middle

SQLite (데이터베이스)


Contents


SQLite 개요


SQL 구문


SQLiteOpenHelper 클래스

메서드 설명
onCreate DB가 처음 만들어질 때 호출됨. 테이블을 생성하고 초기 레코드를 삽입한다.
onUpgrade DB 업그레이드 시 호출됨. 기존 테이블 삭제 및 생성하거나 ALTER TABLE로 스키마 수정

예제 코드

public class MyDBHelper extends SQLiteOpenHelper {
*   private static final String DB_NAME="schedule.db";
    private static final int DATABASE_VERSION = 1;

    public MyDBHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
*       db.execSQL("CREATE TABLE schedule (" +
*               "_id INTEGER  NOT NULL PRIMARY KEY," +
*               "title TEXT  NULL," +
*               "datetime DATETIME  NULL" +
*               ");");
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
*       db.execSQL("DROP TABLE IF EXISTS schedule");
        onCreate(db);
    }

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/java/com/example/kwanwoo/sqlitedbtest/MyDBHelper.java]


SQLiteOpenHelper 클래스

메서드 설명
getReadableDatabase 읽기 위해 DB open. DB가 없거나 버전 변경 시 onCreate, onUpgrade가 호출됨.
getWritableDatabase 읽고 쓰기 위해 DB open. 권한이 없거나 디스크 용량 부족 시 실패한다.
close DB를 닫는다.

예제 코드 (INSERT)

    button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              EditText title = (EditText)findViewById(R.id.title1);
              try {
*                 String sql = String.format (
*                         "INSERT INTO schedule (_id, title, datetime)\n"+
*                         "VALUES (NULL, '%s', '%s')",
*                         title.getText(), getDateTime());                          
*                 helper.getWritableDatabase().execSQL(sql);
              } catch (SQLException e) {
                  Log.e(TAG,"Error inserting into DB");
              }
          }
    });

getDateTime(): “yyyy-MM-dd HH:mm:ss” 형식의 문자열 반환

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/java/com/example/kwanwoo/sqlitedbtest/MainActivity.java]


예제 코드 (DELETE)

    button1.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              EditText title2 = (EditText)findViewById(R.id.title2);
              try {
*                 String sql = String.format (
*                             "DELETE FROM schedule\n"+
*                             "WHERE title = '%s'",
*                             title2.getText());

*                 helper.getWritableDatabase().execSQL(sql);
              } catch (SQLException e) {
                  Log.e(TAG,"Error deleting recodes");
              }
          }
    });

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/java/com/example/kwanwoo/sqlitedbtest/MainActivity.java]


예제 코드 (UPDATE)

    button2.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              EditText title3 = (EditText)findViewById(R.id.title3);
              EditText title4 = (EditText)findViewById(R.id.title4);
              try {
*                 String sql = String.format (
*                         "UPDATE  schedule\n"+
*                         "SET title = '%s'\n"+
*                         "WHERE title='%s'",
*                                title4.getText(), title3.getText()) ;
                  helper.getWritableDatabase().execSQL(sql);
              } catch (SQLException e) {
                  Log.e(TAG,"Error deleting recodes");
              }
          }
    });

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/java/com/example/kwanwoo/sqlitedbtest/MainActivity.java]


예제 코드 (SELECT)

    button3.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              TextView result = (TextView)findViewById(R.id.result);
*             String sql = "Select * FROM schedule";
*             Cursor cursor = helper.getReadableDatabase().rawQuery(sql,null);
              StringBuffer buffer = new StringBuffer();
*             while (cursor.moveToNext()) {
*                 buffer.append(cursor.getString(1)+"\t");
*                 buffer.append(cursor.getString(2)+"\n");
              }
              result.setText(buffer);
          }
    });

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/java/com/example/kwanwoo/sqlitedbtest/MainActivity.java]

??? Cursor의 getString(int columnIndext) 메소드는 문자열 형태로 columnIndex에 해당하는 테이블의 속성 값을 리턴한다. 즉, cursor.getString(1)은 schedule 테이블의 title 속성을 리턴하고, cursor.getString(2)는 schedule 테이블의 datetime 속성을 리턴한다.


SQLite Cursor

메서드 설명
close 결과셋을 닫는다.
getColumnCount 컬럼의 개수를 구한다
getColumnIndex 이름으로부터 컬럼 번호를 구한다.
getColumnName 번호로부터 컬럼 이름을 구한다.
getCount 결과셋의 레코드 개수를 구한다.
getInt 컬럼값을 정수로 구하며 인수로 컬럼 번호를 전달한다.
getDouble 컬럼값을 실수로 구한다.
getString 컬럼값을 문자열로 구한다.
moveToFirst 첫 레코드 위치로 이동하며, 결과셋이 비어있을 시 false를 리턴한다.
moveToLast 마지막 레코드 위치로 이동하며, 결과셋이 비어있을 시 false를 리턴한다.
moveToNext 다음 레코드 위치로 이동하며, 마지막 레코드이면 false를 리턴한다.
moveToPrevious 이전 레코드로 이동하며, 첫 레코드이면 false를 리턴한다.
moveToPosition 임의의 위치로 이동한다.

SimpleCursorAdapter (1/3)


SimpleCursorAdapter (2/3)

  button3.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          String sql = "Select * FROM schedule";
          Cursor cursor = helper.getReadableDatabase().rawQuery(sql,null);
          SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),
                  R.layout.item, cursor, new String[]{"title", "datetime"},
                  new int[]{R.id.tvTitle, R.id.tvDate}, 0);
          ListView lv = (ListView)findViewById(R.id.listview);
          lv.setAdapter(adapter);
      }
    });

.footnote[https://github.com/jyheo/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/java/com/example/kwanwoo/sqlitedbtest/MainActivity.java#L89]


SimpleCursorAdapter (3/3)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textColor="@color/colorPrimary"
        android:layout_weight="1"/>
    <TextView
        android:id="@+id/tvDate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textColor="@color/colorPrimaryDark"
        android:layout_weight="1"/>
</LinearLayout>

.footnote[https://github.com/jyheo/AndroidExamples/blob/master/chap7/SQLiteDBTest/app/src/main/res/layout/item.xml]