SQLite는 데이터베이스 관리 시스템이다.
서버가 아니라 응용 프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다.
관계형 데이터베이스(RDBMS)는 Table 형태로 데이터를 관리한다.관계형 데이터베이스의 종류는 참 많다.
MySQL, MSSql, MariaDB, Oracle, H2, sqlite 등
이중 SQLite는 'sql이지만 가볍다.' 라는 뜻으로 지어졌다고 한다. (진짠가?ㅎㅎ)
안드로이드에는 SQLite가 내장되어 있다.
이 DB에 저장된 데이터는 어플이 종료되거나, 디바이스 전원이 꺼지더라도 삭제되지 않는다.
데이터의 삽입/삭제/변경 등은 쿼리문을 사용하여 이용한다.
mySql, mariaDB와 문법이 동일하다.
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE if not exists mytable ("
+ "_id integer primary key autoincrement,"
+ "txt text);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "DROP TABLE if exists mytable";
db.execSQL(sql);
onCreate(db);
}
}
class DBHelper(context: Context?,name: String?,factory: SQLiteDatabase.CursorFactory?,version: Int) : SQLiteOpenHelper(context, name, factory, version) {
override fun onCreate(db: SQLiteDatabase) {
var sql : String = "CREATE TABLE if not exists mytable (" +
"_id integer primary key autoincrement," +
"txt text);";
db.execSQL(sql)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
val sql : String = "DROP TABLE if exists mytable"
db.execSQL(sql)
onCreate(db)
}
}
onCreate() 및 onUpgrade() 콜백 메서드를 재정의하는 서브 클래스를 생성해야 한다. onDowngrade() 또는 onOpen() 메서드를 구현할 수도 있지만 이러한 메서드가 필수는 아니다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBHelper helper;
SQLiteDatabase db;
helper = new DBHelper(MainActivity.this, "newdb.db", null, 1);
db = helper.getWritableDatabase();
helper.onCreate(db);
}
}
class MainActivity : AppCompatActivity() {
lateinit var dbHelper : DBHelper
lateinit var database :SQLiteDatabase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dbHelper = DBHelper(this, "newdb.db", null, 1)
database = dbHelper.writableDatabase
}
}
// 쓰기 모드로 데이터 저장소를 가져옴
val db = dbHelper.writableDatabase
// 열 이름이 키인 새 값 맵을 만들기
val values = ContentValues().apply {
put(FeedEntry.COLUMN_NAME_TITLE, title)
put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle)
}
// 새 행을 삽입하고 새 행의 기본 키 값을 반환
val newRowId = db?.insert(FeedEntry.TABLE_NAME, null, values)
insert() 메서드는 오류가 발생하면 -1을 반환
// 쿼리의 'where'부분을 정
val selection = "${FeedEntry.COLUMN_NAME_TITLE} LIKE ?"
// 자리 표시 자 순서로 인수를 지정
val selectionArgs = arrayOf("MyTitle")
// SQL 문을 실행
val deletedRows = db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs)
val db = dbHelper.writableDatabase
//하나의 열에 들어갈 새 값
val title = "NewTitle"
val values = ContentValues().apply {
put(FeedEntry.COLUMN_NAME_TITLE, title)
}
// 제목에 따라 업데이트 할 행
val selection = "${FeedEntry.COLUMN_NAME_TITLE} LIKE ?"
val selectionArgs = arrayOf("OldTitle")
val count = db.update(
FeedEntry.TABLE_NAME,
values,
selection,
selectionArgs)
테이블을 업데이트하면 insert()의 ContentValues 구문과 delete()의 WHERE 구문이 결합됨
val db = dbHelper.readableDatabase
val projection = arrayOf(BaseColumns._ID, FeedEntry.COLUMN_NAME_TITLE, FeedEntry.COLUMN_NAME_SUBTITLE)
// title이 My Title인 것 선택
val selection = "${FeedEntry.COLUMN_NAME_TITLE} = ?"
val selectionArgs = arrayOf("My Title")
// 결과를 정렬할 방법
val sortOrder = "${FeedEntry.COLUMN_NAME_SUBTITLE} DESC"
val cursor = db.query(
FeedEntry.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
)
위와 같이 예전에는 SQLite를 사용하려면 쿼리문을 전부 알고 있어야 했다.
이를 편리하게 하기 위해 구글 측에서 안드로이드에서 발표한 라이브러리가 있다. → ROOM !!
이 라이브러리에 대해선 다음 포스트에서 설명할 것이다.