SQLite는 사용 가능한 자료형은 아래와 같이 5가지만 지원 합니다.
1. NULL
2. INTEGER : 1, 2, 3, 4, 6, 8 bytes의 정수 값
3. REAL : 8bytes의 부동 소수점 값
4. TEXT : UTF-8, UTF-16BE, UTF-16LE 인코딩의 문자열
5. BLOB : 입력 된 그대로 저장
그럼 이제부터 SQLite 사용 방법에 대하여 하나씩 알아보도록 하겠습니다.
1. SQLiteOpenHelper를 상속받은 기본 구조
DBManager라는 새로운 클래스를 생성하고 SQLite를 사용하기 위해서 SQLiteOpenHelper를 상속 받았습니다. 그리고 아래와 같이 필수로 작성되어야 하는 함수가 존재합니다.
DBManager() 함수는 생성자로 DB 이름과 버전을 넘겨 받습니다.
onCreate() 함수는 생성자에서 넘겨받은 이름과 버전의 데이터베이스가 존재하지 않을때 한번 호출 됩니다. 그렇기 때문에 새로운 데이터베이스를 생성할때 사용하기에 알맞습니다.
onUpgrade() 함수는 데이터베이스가 존재하지만 버전이 다르면 호출 됩니다. 데이터베이스를 변경하고 싶을때 버전을 올려주고 새로운 작업을 해주면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package pe.berabue.tutorialdatabase; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBManager extends SQLiteOpenHelper { public DBManager(Context context, String name, CursorFactory factory, int version) { super (context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } |
2. 데이터베이스 생성
새로운 데이터베이스를 생성하고 제대로 생성이 되었는지 확인해 보겠습니다. 단말기를 사용해서 확인을 하려면 루팅을 해야하고 에뮬레이터를 사용하면 명령프롬프트를 사용해서 확인을 할 수 있습니다. 여기서는 두 방법을 사용하지 않고 DB를 검색하여 데이터가 제대로 들어 갔는지 확인해보겠습니다.
먼저 DB가 존재하지 않을때 아래와 같은 FOOD_LIST 테이블을 생성하도록 하겠습니다.
1 2 3 4 5 6 | @Override public void onCreate(SQLiteDatabase db) { // 새로운 테이블을 생성한다. // create table 테이블명 (컬럼명 타입 옵션); db.execSQL( "CREATE TABLE FOOD_LIST( _id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price INTEGER);" ); } |
FOOD_LIST 라는 테이블에 정수형, 기본 키 그리고 자동으로 값이 증가하는 _id 컬럼과, Text형식의 name 컬럼, 정수형 price 컬럼으로 구성 되도록 만들었습니다.
3. 삽입, 삭제, 갱신, 선택
Xml에 코드를 작성하여 버튼과 에디트 텍스트를 만들고 삽입, 삭제, 갱신, 선택을 해보도록 하겠습니다.
main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <Linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" > <EditText android:id= "@+id/et_foodname" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:hint= "Food Name" /> <EditText android:id= "@+id/et_price" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:hint= "Price" /> <Textview android:id= "@+id/tv_result" android:layout_width= "match_parent" android:layout_height= "wrap_content" /> <Button android:id= "@+id/btn_insert" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:text= "insert" /> <Button android:id= "@+id/btn_update" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:text= "update" /> <Button android:id= "@+id/btn_delete" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:text= "delete" /> <Button android:id= "@+id/btn_select" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:text= "select" /> </LinearLayout> |
기본 생성 된 main.xml에 테이블에 입력시킬 name과 price를 입력받는 EditText 두개, 쿼리 실행 후 테이블 안의 내용을 출력 할 TextView하나 그리고 삽입, 삭제, 갱신, 선택을 실행 할 Button 4개로 구성하였습니다.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package pe.berabue.tutorialdatabase; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); final DBManager dbManager = new DBManager(getApplicationContext(), "Food.db" , null , 1 ); // DB에 저장 될 속성을 입력받는다 final EditText etName = (EditText) findViewById(R.id.et_foodname); final EditText etPrice = (EditText) findViewById(R.id.et_price); // 쿼리 결과 입력 final TextView tvResult = (TextView) findViewById(R.id.tv_result); // Insert Button btnInsert = (Button) findViewById(R.id.btn_insert); btnInsert.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // insert into 테이블명 values (값, 값, 값...); String name = etName.getText().toString(); String price = etPrice.getText().toString(); dbManager.insert( "insert into FOOD_LIST values(null, '" + name + "', " + price + ");" ); tvResult.setText( dbManager.PrintData() ); } }); // Update Button btnUpdate = (Button) findViewById(R.id.btn_update); btnUpdate.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // update 테이블명 where 조건 set 값; String name = etName.getText().toString(); String price = etPrice.getText().toString(); dbManager.update( "update FOOD_LIST set price = " + price + " where name = '" + name + "';" ); tvResult.setText( dbManager.PrintData() ); } }); // Delete Button btnDelete = (Button) findViewById(R.id.btn_delete); btnDelete.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // delete from 테이블명 where 조건; String name = etName.getText().toString(); dbManager.delete( "delete from FOOD_LIST where name = '" + name + "';" ); tvResult.setText( dbManager.PrintData() ); } }); // Select Button btnSelect = (Button) findViewById(R.id.btn_select); btnSelect.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { tvResult.setText( dbManager.PrintData() ); } }); } } |
main.xml에서 선언해 주었던 위젯들을 연결하고 각 버튼을 누를때 DBManager로 쿼리를 요청하도록 되어있습니다.
마지막 select 쿼리는 DBManager에 테이블의 모든 요소를 가져오도록 만들었습니다.
DBManager.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package pe.berabue.tutorialdatabase; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBManager extends SQLiteOpenHelper { public DBManager(Context context, String name, CursorFactory factory, int version) { super (context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { // 새로운 테이블을 생성한다. // create table 테이블명 (컬럼명 타입 옵션); db.execSQL( "CREATE TABLE FOOD_LIST( _id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price INTEGER);" ); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public void insert(String _query) { SQLiteDatabase db = getWritableDatabase(); db.execSQL(_query); db.close(); } public void update(String _query) { SQLiteDatabase db = getWritableDatabase(); db.execSQL(_query); db.close(); } public void delete(String _query) { SQLiteDatabase db = getWritableDatabase(); db.execSQL(_query); db.close(); } public String PrintData() { SQLiteDatabase db = getReadableDatabase(); String str = "" ; Cursor cursor = db.rawQuery( "select * from FOOD_LIST" , null ); while (cursor.moveToNext()) { str += cursor.getInt( 0 ) + " : foodName " + cursor.getString( 1 ) + ", price = " + cursor.getInt( 2 ) + "\n" ; } return str; } } |
가장 핵심적인 부분이라고 할 수 있겠습니다.
소스를 보시면 insert(), update(), delete() 함수의 내용이 똑같이 생겼는데요. 원래는 DBManager 이 소스에서 쿼리를 작성하려고 했는데 MainActivity.java에 작성을 하다보니 함수의 내용이 똑같아져 버렸습니다. 이쪽에다가 쿼리를 작성해 주는게 더 좋겠죠.
getReadableDatabase() : 읽기 가능, 사용 후 close()로 종료
getWritableDatabase() : 읽기, 쓰기 가능, 사용 후 close()로 종료
PrintData()함수를 보시면 삽입, 삭제, 갱신 쿼리를 요청 할 때는 execSQL() 함수를 사용 하지만 선택을 할 때는 rawQuery() 함수를 사용 하여야 합니다. select 쿼리는 결과값을 받아야 하기 때문에요.
Cursor로 결과값을 받아서 moveToNext() 함수로 null이 나올때 까지 하나씩 이동해가면서 결과값에 접근합니다.
값을 가져올때는 테이블을 생성할 때 속성 순서대로 0 부터 생성 된 속성까지 얻어 올 수 있습니다.
Select
- select * from 테이블명;
테이블의 모든 속성과 값을 가져온다.
- select 속성, 속성... from 테이블명;
테이블에 선택한 속성의 값만 가져온다.
Insert
- insert into 테이블명 values(속성, 속성...);
테이블에 입력한 속성값으로 추가 한다. (속성의 순서가 일치해야 함)
Delete
- delete from 테이블명 where 조건, 조건...;
테이블에 조건이 일치하는 값을 삭제한다.
Update
- update 테이블명 set 값, 값... where 조건, 조건...;
테이블에 조건에 일치하는 속성의 값을 입력한 값으로 변경한다.
쿼리문에 조건은 콤마(,) 사용 시 여러 조건을 가질 수 있습니다.
기본적인 SQLite 사용방법 튜토리얼은 여기까지 입니다.
위 소스에는 예외처리가 안되어있습니다.