안드로이드 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
에서는 버전이 올라가면 이전버전을 지우고 새 버전의 테이블을 생성한다.
데이터베이스 삽입 선택
데이터 삽입
@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
댓글남기기