출처 : http://mainia.tistory.com/670
오늘은 안드로이드 DB 인 SQLite 를 다루는 방법에 대해 기술하기로 한다.
어떤 언어에서나 DB 를 다루는 것은 필수이다. 장기로 보관하고 그것을 다시
효율적으로 꺼내서 다룰수 있어서 프로그램을 다이나믹하게 만들수 있기
때문이다.
안드로이드에서는 DB 외에 저장하는 방법이 여러가지 있다. 그중하나가
SQLite 를 사용하는 것이다. 휴대폰에서 차용한 만큼 심플하고 가볍다.
그리고 안드로이드 프레임웍에서 Help 클래스를 제공한다. 그것이 크게
두가지 클래스를 사용하는데 SQLiteDatabase, SQLiteOpenHelper 이다.
SQLiteOpenHelper 를 상속받은 클래스를 만들것이다. 주요 함수는
onCreate, onUpgrade, onOpen 이며 데이타베이스 생성과 관리, 존재여부에
대한 역활을 한다.
SQLiteDatabase 는 실질적으로 CRUD 를 수행하는데 쓰인다.
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
1. 데이타베이스 기능을 수행하기 위한 Contact 클래스 만들기 |
직접 쿼리를 작성해 CRUD 를 하는 것이 아니라 getter 와 setter 메소드가 있는
Contact 클래스를 만들어 기능을 수행할 것이다.
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 | public class Contact { int id; String name; String phone_number; public Contact(){ } public Contact( int id, String name, String phone_number){ this .id = id; this .name = name; this .phone_number = phone_number; } public Contact(String name, String phone_number){ this .name = name; this .phone_number = phone_number; } public int getID(){ return this .id; } public void setID( int id){ this .id = id; } public String getName(){ return this .name; } public void setName(String name){ this .name = name; } public String getPhoneNumber(){ return this .phone_number; } public void setPhoneNumber(String phone_number){ this .phone_number = phone_number; } } |
2. CRUD 를 수행할 클래스 작성 |
데이타베이스를 다루기 위해 읽기와 쓰기 함수들이 필요하다.
이런 CRUD 기능을 수행하기 위해 다음 함수들을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 새로운 contact 추가 public void addContact(Contact contact) {} // 아이디에 해당하는 contact 가져오기 public Contact getContact( int id) { } // 모든 contact 리스트 가져오기 public List<contact> getAllContacts() { } // 가져온 contact 숫자 가져오기 public int getContactsCount() { } // contact 업데이트 public int updateContact(Contact contact) { } // contact 삭제하기 public void deleteContact(Contact contact) { } </contact> |
위의 함수를 하나하나 구현해 본다.
(1) 새로운 contact 추가
addContact 함수는 파라미터로 Contact 객체를 넘기게 되어있다.
넘겨받은 Contact 객체의 값을 ContentValues 객체생성후 값을 채워넣는다.
값을 셋팅한 ContentValues 가 데이타베이스에 집어넣기 위한 매개체가 된다.
1 2 3 4 5 6 7 8 9 10 11 12 | // 새로운 contact 추가 public void addContact(Contact contact) { SQLiteDatabase db = this .getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); // Name 필드명 values.put(KEY_PH_NO, contact.getPhoneNumber()); // phone number 필드명 // 새로운 Row 추가 db.insert(TABLE_CONTACTS, null , values); db.close(); // 연결종료 } |
(2) 아이디에 해당하는 Contact 가져오기
여기에서는 id 필드에 값을 넘겨주고 해당하는 하나의 행값을 가져온다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // 아이디에 해당하는 contact 가져오기 public Contact getContact( int id) { SQLiteDatabase db = this .getReadableDatabase(); Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NAME, KEY_PH_NO }, KEY_ID + "=?" , new String[] { String.valueOf(id) }, null , null , null , null ); if (cursor != null ) cursor.moveToFirst(); Contact contact = new Contact(Integer.parseInt(cursor.getString( 0 )), cursor.getString( 1 ), cursor.getString( 2 )); return contact; } |
(3) 테이블에 포함된 모든 Contact 데이타 가져오기
아이디에 해당하는 데이타를 가져올때 사용한 db.query 와 달리 이번에는
순수한 쿼리를 이용한다. 2번에서 사용한 query 함수를 사용하기 복잡하다면
문자열로 쿼리를 조합해 rawQuery 를 사용하면 될것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // 모든 contact 리스트 가져오기 public List<contact> getAllContacts() { List<contact> contactList = new ArrayList<contact>(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this .getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null ); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { Contact contact = new Contact(); contact.setID(Integer.parseInt(cursor.getString( 0 ))); contact.setName(cursor.getString( 1 )); contact.setPhoneNumber(cursor.getString( 2 )); // Adding contact to list contactList.add(contact); } while (cursor.moveToNext()); } return contactList; } </contact></contact></contact> |
(4) 테이블에 포함된 데이타 숫자 세기
3번에서 사용한 방법과 동일하며 리턴받은 Cursor 객체에서 getCount 함수를
사용해 갯수정보를 가져오면 된다.
1 2 3 4 5 6 7 8 9 | public int getContactsCount() { String countQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this .getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null ); cursor.close(); // return count return cursor.getCount(); } |
(5) contact 데이타 업데이트하기
파라미터로 넘겨준 Contact 객체를 업데이트 한다. 업데이트 해야할 contact id 는
포함되어있으므로 getter 함수를 사용해 꺼내쓰면 된다
1 2 3 4 5 6 7 8 9 10 11 | public int updateContact(Contact contact) { SQLiteDatabase db = this .getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); values.put(KEY_PH_NO, contact.getPhoneNumber()); // updating row return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?" , new String[] { String.valueOf(contact.getID()) }); } |
(6) contact 데이타 삭제하기
파라미터로 넘겨준 Contact 객체에 해당하는 값을 삭제한다. 직접 쿼리를 작성해
삭제하고자 한다면 rawQuery 함수를 사용하면 된다.
1 2 3 4 5 6 | public void deleteContact(Contact contact) { SQLiteDatabase db = this .getWritableDatabase(); db.delete(TABLE_CONTACTS, KEY_ID + " = ?" , new String[] { String.valueOf(contact.getID()) }); db.close(); } |
3. 전체소스 |
전체소스에서는 onCreate 와 onUpgrade 를 구현한 것을 볼수 있다.
onCreate 는 작업을 하기 위한 테이블 생성 쿼리를 수행하는 것이다.
onUpgrade 는 기존에 있던 테이블을 삭제하고 새로 생성한다.
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.example.bookmanager.Contact; public class DBContactHelper extends SQLiteOpenHelper { // All Static variables // Database Version private static final int DATABASE_VERSION = 1 ; // Database Name private static final String DATABASE_NAME = "contactsManager" ; // Contacts table name private static final String TABLE_CONTACTS = "contacts" ; // Contacts Table Columns names private static final String KEY_ID = "id" ; private static final String KEY_NAME = "name" ; private static final String KEY_PH_NO = "phone_number" ; public DBContactHelper(Context context) { super (context, DATABASE_NAME, null , DATABASE_VERSION); } // Creating Tables @Override public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")" ; db.execSQL(CREATE_CONTACTS_TABLE); } // Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older table if existed db.execSQL( "DROP TABLE IF EXISTS " + TABLE_CONTACTS); // Create tables again onCreate(db); } /** * CRUD 함수 */ // 새로운 Contact 함수 추가 public void addContact(Contact contact) { SQLiteDatabase db = this .getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); // Contact Name values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone // Inserting Row db.insert(TABLE_CONTACTS, null , values); db.close(); // Closing database connection } // id 에 해당하는 Contact 객체 가져오기 public Contact getContact( int id) { SQLiteDatabase db = this .getReadableDatabase(); Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NAME, KEY_PH_NO }, KEY_ID + "=?" , new String[] { String.valueOf(id) }, null , null , null , null ); if (cursor != null ) cursor.moveToFirst(); Contact contact = new Contact(Integer.parseInt(cursor.getString( 0 )), cursor.getString( 1 ), cursor.getString( 2 )); // return contact return contact; } // 모든 Contact 정보 가져오기 public List<contact> getAllContacts() { List<contact> contactList = new ArrayList<contact>(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this .getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null ); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { Contact contact = new Contact(); contact.setID(Integer.parseInt(cursor.getString( 0 ))); contact.setName(cursor.getString( 1 )); contact.setPhoneNumber(cursor.getString( 2 )); // Adding contact to list contactList.add(contact); } while (cursor.moveToNext()); } // return contact list return contactList; } //Contact 정보 업데이트 public int updateContact(Contact contact) { SQLiteDatabase db = this .getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, contact.getName()); values.put(KEY_PH_NO, contact.getPhoneNumber()); // updating row return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?" , new String[] { String.valueOf(contact.getID()) }); } // Contact 정보 삭제하기 public void deleteContact(Contact contact) { SQLiteDatabase db = this .getWritableDatabase(); db.delete(TABLE_CONTACTS, KEY_ID + " = ?" , new String[] { String.valueOf(contact.getID()) }); db.close(); } // Contact 정보 숫자 public int getContactsCount() { String countQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this .getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null ); cursor.close(); // return count return cursor.getCount(); } } </contact></contact></contact> |
4. DBContactHelper 클래스를 사용해 DB 제어 하기 |
위에서 만든 클래스를 사용해 샘플데이타를 집어넣고 다시 읽어 들여서
Logcat 에서 확인할수 있도록 log 를 출력하는 예제이다.
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 | import java.util.List; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import com.example.bookmanager.comm.DBContactHelper; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); DBContactHelper db = new DBContactHelper( this ); /** * CRUD Operations * */ // 샘플데이타 넣기 Log.d( "Insert: " , "Inserting .." ); db.addContact( new Contact( "Ravi" , "9100000000" )); db.addContact( new Contact( "Srinivas" , "9199999999" )); db.addContact( new Contact( "Tommy" , "9522222222" )); db.addContact( new Contact( "Karthik" , "9533333333" )); // 집어넣은 데이타 다시 읽어들이기 Log.d( "Reading: " , "Reading all contacts.." ); List<contact> contacts = db.getAllContacts(); for (Contact cn : contacts) { String log = "Id: " +cn.getID()+ " ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber(); Log.d( "Name: " , log); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true ; } } </contact> |
5. 로그 확인 |
이제 실행해서 제대로 로그가 찍히는지 확인한다.
Logcat 을 통해 제대로 들어가고 불러와 지는지 확인할수 있다.
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5