개발공부

[Android] SQLite 데이터베이스 활용하는 방법 본문

Android

[Android] SQLite 데이터베이스 활용하는 방법

mscha 2022. 7. 18. 10:05

주소록 테이블 예제

 

1.  새로운 프로젝트를 생성하고, MainActivity가 있는 패키지에 아래와 같은 패키지를 생성해줍니다.

data : 데이터베이스를 다룰 수 있는 핸들러 클래스가 들어갈 패키지

model : 데이터 베이스 테이블이 들어갈 패키지

util : 데이터 베이스를 다루기 위해 필요한 것들을 넣을 수 있는 패키지 (테이블 명, 컬럼 명 같은 상수)

 

2. util/Util.java

package com.fullspringwater.sqlitesample.util;

public class Util {
    // 데이터베이스 관련된 상수
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "contact_db";
    public static final String TABLE_NAME = "contacts";

    // 테이블의 컬럼 관련된 상수
    public static final String KEY_ID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PHONE = "phone";
}

 

3. model/Contact.java

package com.fullspringwater.sqlitesample.model;

public class Cantact {
    public int id;
    public String name;
    public String phone;
    
    public Contact(int id, String name, String phone){
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

    public Contact(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }
    
}

 

4. data/DatabaseHandler.java

 

4-1.SQLiteOpenHelper 를 extends 합니다.

4-2. 빨간 전구를 클릭한 후 Implement methods를 클릭합니다.

4-3. 나오는 함수를 모두 선택후 OK를 클릭합니다.

 

4-4. 다시한번 전구를 클릭한후 Create constructor matching super를 누릅니다.

4-5. 그리고 아무 생성자를 하나 생성해줍니다.

 

4-6. 생성자를 아래와 같이 고칩니다.

public DatabaseHandler(@Nullable Context context) {
    super(context, Util.DATABASE_NAME, null, Util.DATABASE_VERSION);
}

 

이제부터 CRUD 기능을 구현해 보겠습니다.

 

4-7.  onCreate()에는 테이블 생성문을, onUpgrade()에는 테이블 삭제후 재생성하는 기능을 넣어줍니다.

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    // 테이블 생성
    String CREATE_CONTACT_TABLE = "create table " + Util.TABLE_NAME + "(" +
            Util.KEY_ID + " integer primary key, " + Util.KEY_NAME + " text, " +
            Util.KEY_PHONE + " text)";

    Log.i("MyContact", "테이블 생성문 : " + CREATE_CONTACT_TABLE);

    // 쿼리 실행
    sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    // 기존의 contact 테이블을 삭제하고,
    String DROP_TABLE = "drop table " + Util.TABLE_NAME;
    sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DATABASE_NAME});

    // 새롭게 테이블을 다시 만든다
    onCreate(sqLiteDatabase);
}

 

4-7. 데이터 추가하는 함수

// 우리가 앱 동작 시키는데 필요한 SQL 문이 적용된 함수들을 만든다.
    // CRUD 관련 함수들을 만든다.
    public void addContact(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.insert(Util.TABLE_NAME, null, values);
        db.close();
    }

 

4-8. 테이블의 전체행을 읽어오는 함수

방법 1. for문

    // 주소록 데이터 전체 가져오기
    // select * from contact;
    public ArrayList<Contact> getAllContact(){
        // 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        // 2. 쿼리문 만든다.
        Cursor cursor = db.rawQuery("select * from " + Util.TABLE_NAME + ";", null);

        ArrayList<Contact> contactList = new ArrayList<>();

        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();
            }
        }

        db.close();
        return contactList;

    }

 

방법 2. do-while문

    // 주소록 데이터 전체 가져오기
    // select * from contact;
    public ArrayList<Contact> getAllContact(){
        // 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        // 2. 쿼리문 만든다.
        Cursor cursor = db.rawQuery("select * from " + Util.TABLE_NAME + ";", null);

        ArrayList<Contact> contactList = new ArrayList<>();

        if(cursor.moveToFirst()){
            do{
                Contact contact = new Contact(
                        cursor.getInt(0), cursor.getString(1), cursor.getString(2));
                contactList.add(contact);
            }while(cursor.moveToNext());
        }

        db.close();
        return contactList;

    }

 

4-9. 테이블 수정하는 함수

방법 1

// 데이터 수정하는 함수
    public void updateContact(Contact contact){
        // 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getWritableDatabase();


        // 쿼리문 만든다.
        db.execSQL("update " + Util.TABLE_NAME +
                        " set " + Util.KEY_NAME + "= ?, " +  Util.KEY_PHONE + " = ? " +
                        "where " + Util.KEY_ID + "= ?;",
                new String[]{contact.name, contact.phone, contact.id+""});

        db.close();
    }

 

방법 2

    // 데이터 수정하는 함수
    public void updateContact(Contact contact){
        // 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getWritableDatabase();

        // 방법 3
        db.execSQL("update " + Util.TABLE_NAME +
                        " set " + Util.KEY_NAME + "= " + contact.name +
                        ", " +  Util.KEY_PHONE + " = " + contact.phone +
                        "where " + Util.KEY_ID + "= " + contact.id);
        db.close();
    }

 

4-10. 데이터 삭제하는 함수

public void deleteContact(Contact contact){
    // delete from contact where id= 1;

    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("delete from " + Util.TABLE_NAME +
            " where " + Util.KEY_ID + " = ?;", new String[]{contact.id+""});
    db.close();
}

 

5. 이제 실제로 사용하는 것을 테스트 해보겠습니다.

5-1. 데이터 생성, 읽어오기 

package com.fullspringwater.sqlitesample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.fullspringwater.sqlitesample.data.DatabaseHandler;
import com.fullspringwater.sqlitesample.model.Contact;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<Contact> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 디비에 저장하기
        // 디비 핸들러 가져오기
        // 데이터베이스에 넣고, 가져오는 것 테스트
        DatabaseHandler db = new DatabaseHandler(MainActivity.this);

        // 컨택 객체 생성
        Contact contact = new Contact("홍길동", "010-1234-5678");

        // 주소록 데이터를 디비에 저장하는 함수 호출
        db.addContact(contact);


        // 주소록 데이터를 디비에서 가져와서, 로그 찍어보자
        contactList = db.getAllContact();

        for(Contact data : contactList){
            Log.i("MyContact: ", "id : " + data.id +
                    ", name : " + data.name + ", phone : " + data.phone);
        }

        db.close();

    }
}

logcat

 

5-2. 데이터 수정하기

id가 1인 데이터를 수정해보겠습니다.

package com.fullspringwater.sqlitesample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.fullspringwater.sqlitesample.data.DatabaseHandler;
import com.fullspringwater.sqlitesample.model.Contact;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<Contact> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 디비에 저장하기
        // 디비 핸들러 가져오기
        // 데이터베이스에 넣고, 가져오는 것 테스트
        DatabaseHandler db = new DatabaseHandler(MainActivity.this);

//        // 컨택 객체 생성
        Contact contact = new Contact(1, "김철수", "010-0000-0000");
//
//        // 주소록 데이터를 업데이트하는 함수 호출
        db.updateContact(contact);

        // 주소록 데이터를 디비에서 가져와서, 로그 찍어보자
        contactList = db.getAllContact();

        for(Contact data : contactList){
            Log.i("MyContact: ", "id : " + data.id +
                    ", name : " + data.name + ", phone : " + data.phone);
        }

        db.close();

    }
}

logcat

 

5-3. 데이터 삭제하기

id가 1인 데이터를 삭제해 보겠습니다.

package com.fullspringwater.sqlitesample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.fullspringwater.sqlitesample.data.DatabaseHandler;
import com.fullspringwater.sqlitesample.model.Contact;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<Contact> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 디비에 저장하기
        // 디비 핸들러 가져오기
        // 데이터베이스에 넣고, 가져오는 것 테스트
        DatabaseHandler db = new DatabaseHandler(MainActivity.this);

//        // 컨택 객체 생성
        Contact contact = new Contact(1, "김철수", "010-0000-0000");

//        // 주소록 데이터를 디비에서 삭제하는 함수 호출
        db.deleteContact(contact);

        // 주소록 데이터를 디비에서 가져와서, 로그 찍어보자
        contactList = db.getAllContact();

        for(Contact data : contactList){
            Log.i("MyContact: ", "id : " + data.id +
                    ", name : " + data.name + ", phone : " + data.phone);
        }

        db.close();

    }
}

데이터가 없어 Logcat 생성이 되지 않습니다.