Android
2015.03.03 17:10

SQLite 데이타 베이스 다루기

조회 수 7290 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

출처 : 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);
                                }