[Android] SQLite 사용하기

Jinny·2021년 1월 28일
0

Android

목록 보기
4/32
post-thumbnail

🚩 SQLite란?

SQLite는 데이터베이스 관리 시스템이다.
서버가 아니라 응용 프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다.

◾ 관계형 데이터베이스

관계형 데이터베이스(RDBMS)는 Table 형태로 데이터를 관리한다.관계형 데이터베이스의 종류는 참 많다.
MySQL, MSSql, MariaDB, Oracle, H2, sqlite 등

이중 SQLite는 'sql이지만 가볍다.' 라는 뜻으로 지어졌다고 한다. (진짠가?ㅎㅎ)

안드로이드에는 SQLite가 내장되어 있다.

이 DB에 저장된 데이터는 어플이 종료되거나, 디바이스 전원이 꺼지더라도 삭제되지 않는다.

🚩 SQLite 사용하기

데이터의 삽입/삭제/변경 등은 쿼리문을 사용하여 이용한다.
mySql, mariaDB와 문법이 동일하다.

◾ 생성하기

DBHelper 생성

  • JAVA
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);
    }
}
  • KOTLIN
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() 메서드를 구현할 수도 있지만 이러한 메서드가 필수는 아니다.

db 생성하기

  • JAVA
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);
    }
}
  • KOTLIN
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
    }
}

------ 여기부턴 Kotlin 코드로만 사용

◾ Insert

// 쓰기 모드로 데이터 저장소를 가져옴
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을 반환

◾ Delete

// 쿼리의 'where'부분을 정
val selection = "${FeedEntry.COLUMN_NAME_TITLE} LIKE ?"
// 자리 표시 자 순서로 인수를 지정
val selectionArgs = arrayOf("MyTitle")
// SQL 문을 실행
val deletedRows = db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs)

◾ Update

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 !!

이 라이브러리에 대해선 다음 포스트에서 설명할 것이다.


출처 : 안드로이드 공식문서 & SQLite 사용법 정리- 헬로 알파카님 블로그
profile
신입 개발자👩‍💻

0개의 댓글