안드로이드 SQLite

Intro

안드로이드 SQLite 알아보기

SQLite

SQLite는 안드로이드에서 사용할 수 있는 가벼운 내부 데이터베이스이다.

DBHelper 클래스 생성

Contract 클래스

public class MemoContract
{
    private  MemoContract() // 인스턴스화 금지
    {
    }

    public static class MemoEntry implements BaseColumns
    {
        public static final String TABLE_NAME="memo";
        public static final String DATE="date";
        public static final String COLUMN_NAME_TITLE="title";
        public static final String COLUMN_NAME_CONTENTS="contents";
    }
}

데이터베이스 스키마를 정의하는 클래스이며 생성자의 접근지정자를 private로 하여 초기화를 방지한다.

내부 Entry클래스에 BaseColumns 인터페이스를 통해 스키마를 정의한다.

BaseColumns 인터페이스 내부에는 _ID_COUNT 상수가 들어있다.

DBOpenHelper 클래스

public class MemoDBHelper extends SQLiteOpenHelper
{
    private static MemoDBHelper sInstance; // 싱글턴 인스턴스 선언

    private static final int DB_VERSION=1;
    private static final String  DB_NAME="Memo.db";
    // 테이블을 생성하는 구문 
    private static final String SQL_CREATE_ENTRIES =
            String.format("CREATE TABLE %s (%s INTEGER PRIMARY KEY AUTOINCREMENT ,%s CHAR[10], %s TEXT, %s TEXT)",
                    MemoContract.MemoEntry.TABLE_NAME,
                    MemoContract.MemoEntry._ID,
                    MemoContract.MemoEntry.DATE,
                    MemoContract.MemoEntry.COLUMN_NAME_TITLE,
                    MemoContract.MemoEntry.COLUMN_NAME_CONTENTS);
                    // _ID를 기본키로 하였으며 AUTOINCREMENT를 이용하면 자동으로 1씩 증가하게된다.

    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + MemoContract.MemoEntry.TABLE_NAME;

    public static MemoDBHelper getInstance(Context context) 
    {
        if(sInstance==null) // 인스턴스가 없으면 생성
        {
            sInstance=new MemoDBHelper(context);
        }
        return sInstance;
    }

    private MemoDBHelper(@Nullable Context context) // private로 하여 외부생성 X
    {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL(SQL_CREATE_ENTRIES);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }
}

SQLiteOpenHelper를 상속받았기 때문에 생성자, onCreate, onUpgrade 메서드가 포함되어야한다.

DBHelper는 하나의 인스턴스만 가져도되기때문에 싱글턴 패턴을 이용해 인스턴스를 생성해주었다.

위에서 만들어둔 Contract 클래스를 이용해 포맷형식으로 작성해둔 쿼리문을 이용해 onCreate 메소드에서 DB를 생성한다.

onUpgrade에서는 버전이 올라가면 이전버전을 지우고 새 버전의 테이블을 생성한다.

데이터베이스 삽입 선택

데이터 삽입

1

@Override
public void onBackPressed()
{
    super.onBackPressed();


    String title = mTitleText.getText().toString();
    String contents = mContentText.getText().toString();

    ContentValues contentValues = new ContentValues();
    contentValues.put(MemoContract.MemoEntry.DATE,SeletedDate);
    contentValues.put(MemoContract.MemoEntry.COLUMN_NAME_TITLE, title);
    contentValues.put(MemoContract.MemoEntry.COLUMN_NAME_CONTENTS, contents);


    SQLiteDatabase db = MemoDBHelper.getInstance(this).getWritableDatabase();


    if (mMemoId == -1)
    {
        long newRowId = db.insert(MemoContract.MemoEntry.TABLE_NAME, null, contentValues);

        if (newRowId == -1)
        {
            Toast.makeText(this, "저장 실패", Toast.LENGTH_SHORT).show();
        } else
        {
            Toast.makeText(this, "메모가 저장되었습니다.", Toast.LENGTH_SHORT).show();
            setResult(RESULT_OK);
        }


    } else
    {
        int count = db.update(MemoContract.MemoEntry.TABLE_NAME,contentValues,MemoContract.MemoEntry._ID+"="+mMemoId,null);

        if(count==0)
        {
            Toast.makeText(this,"수정에 문제가 발생하였습니다.",Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(this,"수정 되었습니다.",Toast.LENGTH_SHORT).show();
                setResult(RESULT_OK);
        }
    }

    super.onBackPressed();
}

메모 저장 액티비티에서 메모를 입력한뒤 뒤로가기 버튼을 누르면 입력한 정보들을 contentValues에 담고 DBHelper의 인스턴스에서 쓰기가능한 데이터베이스를 불러온다음 insert를 통해 저장한다.

이때 insert() 메소드에서 return되는 long값이 -1이면 Error이므로 실패 토스트를 띄우고 그외엔 성공 토스트를 띄우도록 한다.

데이터 선택

dbHelper = MemoDBHelper.getInstance(getActivity());

Cursor cursor = dbHelper.getReadableDatabase().query(MemoContract.MemoEntry.TABLE_NAME, null, "date=?", params, null, null, null);

DBHelper의 인스턴스를 불러온다음 ReadbleDataBase에서 쿼리문을 이용하여 해당되는 테이블의 행 정보를 커서에 저장하도록 한다.

while (cursor.moveToNext())
{
    list.add(cursor.getString(cursor.getColumnIndex(MemoContract.MemoEntry.COLUMN_NAME_TITLE)));
}

저장된 커서를 반복문을 이용하여 getColumnIndex을 통해 해당 컬럼값을 리스트에 저장한다음 다양하게 사용 할 수 있다.

참고자료

https://youtu.be/lf6GOaTRCgA?list=PLCrbv-zEn8IyW2phtqOzLHljt8XvAlmya

댓글남기기