SQLite의 개념, 준비 내용의 피드는 하기 링크 참고:
https://yeo0616.tistory.com/206
데이터 CRUD 명령어
Create,Read,Update,Delete
SQL | 명령 | 설명 |
SELECT | Read | 데이터 조회 SELECT 컬럼 FROM 테이블명 WHERE 조건 |
INSERT | Create | 데이터 삽입 INSERT INTO 테이블명 VALUES (데이터) |
UPDATE | Update | 데이터 수정 UPDATE 테이블명 SET 컬럼 = 데이터 WHERE 조건 |
DELETE | Delete | 데이터 삭제 DELETE FROM 테이블명 WHERE 조건 |
데이터 삽입/ 추가 : INSERT
void addContact(Contact contact){
// 테이블의 컬럼이름과 해당 데이터를 매칭해서 넣어준다.
ContentValues values = new ContentValues();
values.put(Util.KEY_NAME, contact.name);
values.put(Util.KEY_PHONE,contact.phone);
// 데이터베이스를 가져온다.
SQLiteDatabase db = this.getWritableDatabase();
// 데이터베이스에, 위의 데이터를 insert
db.insert(Util.TABLE_NAME,null,values);
//db를 닫아줘야한다.
db.close();
}
SQLiteOpenHelper를 이용해서 값을 입력할 때는 자바의 HashMap(파이썬 딕셔너리과 같은 개념)처럼 키,값 형태로 사용되는 ContentValues 클래스를 사용한다.
ContentValues 클래스는 ContentResolver가 처리 할수 있는 값 집합을 저장하는데 사용된다. ContentValues는 ContentResolver가 사용하는 데이터 운송 수단이라고 생각하면 좋을 것 같다.
ContentValues에 put(“컬럼명”, 값)으로 저장한다.
SQLiteDatabase db = this.getWritableDatabase()
-> getWritableDatabase(): 읽고 쓰기 위해 DB를 연다. 권한이 없거나 디스크가 가득 차면 실패
상속받은 SQLiteOpenHelper에 이미 구현된 WritableDatabase에 테이블명과 함께 앞에서 작성한 값을 전달해서 Insert()하고, 사용한 후에는 clase()를 호출해서 꼭 닫아줘야한다.
데이터 조회: SELECT
조회 메서드는 반환값이 있으므로 메서드의 가장 윗줄에 반환할 값을 변수로 선언하고, 가장 아랫줄에서 반환하는 코드를 작성한 후 그사이에 구현 코드를 작성하는 것이 좋다.
조회 1: 데이터 전체 가져오기
주소록 데이터 전체 가져오기
쿼리문: select * from contact;
ex) 1, 홍길동, 01022
ex) 2, 김나나, 02122
public ArrayList<Contact> getAllContacts() {
// 1. 데이터베이스를 가져온다.
SQLiteDatabase db = this.getReadableDatabase();
// 2. 쿼리문 만든다.
Cursor cursor = db.rawQuery("select * from contact", null);
ArrayList<Contact> contactList = new ArrayList<Contact>();
if(cursor.moveToFirst()){
do{
Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
contactList.add(contact);
}while(cursor.moveToNext());
}
return contactList;
}
SQLiteDatabase db = this.getReadableDatabase(); |
getReadableDatabase(): DB 읽기. DB가 없다면 onCreate()가 호출되고, version이 바뀌었다면 onUpgrade()를 호출한다.
Cursor cursor = db.rawQuery("select * from contact", null); |
데이터베이스의 rawQuery() 메서드에 쿼리문을 담아서 실행하면 커서(cursor) 형태로 값이 반환된다.
커서(cursor): 데이터셋을 처리할 때 현재 위치를 포함하는 데이터 요소. 커서를 사용하면 쿼리를 통해 반환된 데이터셋을 반복문으로 반복하여 하나씩 처리할 수 있다. 반복할 때마다 커서가 현재 위치를 가리키고 있어 [데이터 읽기 -> 다음 줄 이동]의 단순 로직으로 데이터를 쉽게 처리할 수 있다.
ArrayList<Contact> contactList = new ArrayList<Contact>() |
커서에 있는 정보(id,name,phone)을 하나씩 빼서, 저장해야할 곳이 필요하다.
여러 데이터를 다룰 때에는 비어있는 리스트를 만들어주고 추가해준다.
Contact를 담을 contactList. 비어있는 리스트를 만들어놓고, 아래 반복문에서 만든 contact 정보를 하나씩 담아준다.
반복문 방법1:
if(cursor.moveToFirst()){
do{
Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
contactList.add(contact);
}while(cursor.moveToNext());
}
cursor를 moveToFisrt() 첫번째 행(Row)을 가르키게 하고 (데이터가 있다면),
do: 먼저 실행하라, while: ~일때까지.
- DB 에 저장된 데이터를 메모리에다 만들어줘야, cpu가 처리할 수 있다.
- 커서의 moveToNext() 메서드가 실행되면, 다음 줄에 사용할 수 있는 데이터가 있는지 여부를 반환하고(리스트에 추가하고), 해당 커서를 다음 위치를 이동시킨다. 데이터가 없으면 반복문을 빠져나간다. 모든 레코드를 읽을 때까지 반복한다.
- 리스트에 데이터 추가를 보다 용이하게 하기 위하여 생성자를 만든다.
원래라면:
//id를 가져오는 방법 cursor.getString(0); // 컬럼 인덱스를 적어넣으면 된다. 커서에 들어있다. //name를 가져오는 방법 cursor.getString(1); // phone을 가져오는 방법 cursor.getString(2); |
혹은 cursor.getColumnIndex(“컬럼명”) 도 된다.
반복문 방법2:
if(cursor.moveToFirst()){ for(int i = 0; i < cursor.getCount(); i++ ){ Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2)); contactList.add(contact); cursor.moveToNext(); }} |
그리고 커서와 읽기전용 데이터베이스를 모두 닫아준다.
cursor.close() db.close() |
데이터베이스를 사용하면 스마트폰의 시스템 자원(메모리, CPU등)을 점유하는 데 한 번 점유한 자원은 반드시 close()를 호출해서 반환한다. close()를 호출하지 않으면 반환되지 않아 자원을 낭비할 수 있다.
최신 프레임워크에서는 자동으로 반환하기도 하지만, 특히 데이터베이스를 사용할 계획이라면 DB는 기본적으로 연결 후에 꼭 해제해야 한다는 점을 기억해야한다.
조회 2: 1개의 데이터 가져오기
- id로 가져오기
쿼리문: select * from contact where id = 3;
public Contact getContact(int id){ // 1. 데이터베이스를 가져온다. SQLiteDatabase db = this.getReadableDatabase(); // 2. 쿼리문 만든다. Cursor cursor = db.rawQuery("select * from contact where id = "+ id, null); if(cursor != null){ cursor.moveToFirst(); } Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2)); return contact; } |
쿼리문 만드는 방법1
Cursor cursor = db.rawQuery("select * from contact where id = "+ id, null); |
데이터베이스의 쿼리문을 작성한다. “=” 뒤에 매개변수 id값을 ‘+’로 붙여주면, 쿼리문에 합류된다.
대신 뒤에의 파라미터는 아무것도 동작안한다 = null
쿼리문 만드는 방법2
Cursor cursor = db.rawQuery("select * from contact where id = ?", new String[]{""+ id}); |
물음표에 매칭되는 걸, 뒤에다가, 문자열 배열로 해서, id는 int니까 ""+ id로 표시해준다. 그러면 변수가 자동으로 세팅된다.
데이터 수정: UPDATE
public void updateContact(Contact contact){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Util.KEY_NAME, contact.name); values.put(Util.KEY_PHONE, contact.phone); db.update(Util.TABLE_NAME, values, Util.KEY_ID + "=?", new String[]{contact.id+""}); db.execSQL("update contact set name = '"+contact.name+"' , phone = '"+contact.phone+"' where id = "+contact.id); db.close(); } |
INSERT와 동일하게 ContentValues를 사용해서 수정할 값을 저장한다.
데이터 삭제: DELETE
INSERT와 동일하게 ContentValues를 사용해서 수정할 값을 저장한다.
삭제 쿼리문은 다음과 같다: DELETE FROM 테이블명 WHERE 조건식
조건식은 “컬럼명 = 값” 의 형태가 된다.
public void deleteContact(Contact contact){ // delete from contact where id = 1; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL("delete from contact where id = ?" , new String[]{ contact.id+""}); db.close(); } |
getWritableDatabase()의 EXECsql() 메서드로 쿼리를 실행한 후 CLOSE()를 호출한다.
'FrontEnd > Android 기초' 카테고리의 다른 글
[Android] 메모: TODO (0) | 2022.07.19 |
---|---|
[Android] RecyclerView와 Adapter를 이용하여 리스트를 화면에 표시 + Vector Asset (0) | 2022.07.19 |
[Android] SQLite3 데이터베이스 01 (feat. SQLiteOpenHelper) (0) | 2022.07.19 |
[Android] TextWatcher 사용법(feat.addTextChangedListener) (0) | 2022.07.19 |
[Android] Android Asset 이름 규칙 (0) | 2022.07.17 |