본문 바로가기
개발/Android

[안드로이드 Android] SQLite 에 대해서

by 언제나초심. 2019. 3. 11.
반응형

개요 


안드로이드 에서 SQLite 를 다루는 것에 대해서 작성해보았습니다. (이것에 대해서 여태 안 썼었네요...)


SQLite 를 이해하기.


<간단히 설명하자면>

  SQLite 는 서비스를 구동시키지 않습니다.



<어렵게 얘기하자면>

 웹을 예로 들어서 '데이터베이스 서비스' (구동중인 서비스) 와 '어플리케이션 서비스' (WAS) 가 각각 따로 구동됩니다. 24시간 풀 가동입니다. 서로 연결을 하는데에 무진장 애로사항이 많고, 성능 차이가 심합니다. (서버를 별도로 구성하면 차이가 더 극심해짐.) 이것을 처리하기 위한 요령으로, Pooling 이라는 기능을 이용합니다. 마치, 프린터에서 인쇄할 때 중간에서 관리해주는 것과 같은 개념입니다. 일반 소프트웨어를 구성할 때에도 비슷하게, '데이터베이스 풀'을 이용하기도 합니다. dbcp 라고도 하겠네요. 마지막의 p 는 pool 의 약자이거나 pooling 의 약자이거나 할 겁니다. 


<다시 돌아와서>


SQLite 는 서비스가 구동되지 않습니다. 즉, 풀링이 없습니다. 


파일로 되어 있으니, 그냥 까서, 읽어서, 써서 넣거나 하면 됩니다. 


스마트폰의 앱들은 각각 따로따로 구성되어 있기 때문에, 큰 데이터베이스 보다는 sqlite 같은 목적의 데이터베이스를 주로 이용하는 것이 아닐까 생각이 듭니다. 


대부분의 기본적 쿼리는 동작이 됩니다. (SQL 이 '표준 query' 라는 말이기 때문에...)



SQLite 가 Android 에서 동작되는 방식 이해하기


SQLiteDatabase 클래스를 이용해서, SQLite 파일을 열고 닫고, 읽고 쓰고 하면 됩니다. 



SQLiteDatabase 클래스

* 클래스 위치 : android.database.sqlite.SQLiteDatabase 

* 공식 Doc : https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase


SQLiteDatabase 클래스는 안드로이드 개발할 때 SQLite 를 연결할 때 주로 사용하는 클래스 입니다.


바로 연결해서 사용하는데에 사용합니다. 


query 메서드, rawQuery 메서드 등이 있습니다. 


사용 자체는 어려울 것이 없습니다....




SQLiteOpenHelper

* 위치 : android.database.sqlite.SQLiteOpenHelper

* 공식 Doc : https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper



SQLite 를 열고, 버저닝 관리하는데 도움을 주는 클래스 입니다. 


내부를 살펴봤는데, 별다른 내용은 없습니다. 


getReadableDatabase() 메서드와 getWritableDatabase() 메서드 등을 호출 할 때에,


버저닝을 체크합니다. 


SQLiteOpenHelper 클래스를 상속받아 만든 클래스에서 version 멤버 변수 값을 넣게 되는데, 이 값을 가지고, 이 값이 기존의 기기에 설치되어 있는 예전 버전의 앱이 갖고 있는 데이터베이스의 버전 과 비교를 하게 됩니다. 


version 변수 값의 크기가 크다면, upgrade 를 진행하고, 낮다면 downgrade 를 진행한다거나 합니다. 


어찌보면 별거 없는 단순한 클래스 입니다...


getReadableDatabase(), getWritableDatabase() 등을 통해서, 결과적으로는 SQLiteDatabase 오브젝트를 리턴합니다.


환경이 Assets 에서 database 를 복사해서 사용하는 경우라면, SQLiteOpenHelper 클래스를 사용할 이유가 거의 없습니다....



여기서 체크하는 버전이라는 것은, SQLite 파일 내부에 저장된 버전 값을 얘기합니다. 


무료 소프트웨어인 'DB Browser for SQLite' 를 이용해서 파일을 열어보면, 'Pragma' 항목에서 'User Version' 이라는 값이 있는데, 이것을 가리키는 말입니다. 파일을 열어서 직접 수정이 가능합니다. 





Assets 에서 데이터베이스 를 비교 하고 복사하는 코드

@작성중 (클래스 분리 해야 되서... 오래 걸리는 중 ㅜㅜ)




앱에서 SQLite 의 파일이 위치하는 경로

앱을 설치했을 때, 자체적으로 SQLite 파일을 생성하게 됩니다. 결론적으로는 App 의 경로에서 databases/ 폴더 이하에 생성되게 됩니다. (이 위치도 향후에 얼마든지 변경될 수는 있습니다. 어디까지나 구글 맘 인거죠...)


현재 확인 가능한 경우로는 아래와 같습니다. (언젠가는 변경될지도 모름...)


/data/data/{패키지명}/databases/




그래서 보통 이 경로를 이용할 때에는 아래와 같은 구문을 주로 이용하게 됩니다.

context.getDatabasePath("데이터베이스이름 (~~.db 까지)"); 



재밌는 것은, 확장자를 반드시 .db 로 안해도 된다는 점입니다. db3, sqlite 와 같은 확장자로 만드는 분들도 계십니다. 거기다 어디까지나 추측이지만, 아예 확장자를 안 넣고 sqlite 디비를 만드는 경우도 있는 것 같습니다. (추측입니다. 그렇게는 안 해봤어요. github 소스들을 보고다니다보면, 뭔가 수상한 파일들이 종종 있습니다. 용량은 큰데 확장자가 없는 파일들... 상당히 데이터베이스 같은 느낌이 나죠)


그래도 확장자는 .db 로 하거나 .sqlite 로 하거나 하는 것이 좋습니다. 먼 나중이 되었을 때 파일 찾으려면 너무 힘들어져요...



'databases' 의 디렉토리에 대해 얘기하자면, SQLiteDatabase 의 openOrCreateDatabase() 와 같은 메서드가 호출 되면서 디렉토리를 생성해주고, 그 안에 db 파일을 생성하는 것으로 생각됩니다. 









반응형