안녕하세요. IT 김군입니다.

 

오늘은 SQLite 초간단 예제!를 메모해보도록 하겠습니다.

 

우선 프로젝트 진행하시다보면 Activity에 모든 코딩을 하시지는 않으시라 생각됩니다!

 

그래서 2개의 Java Class를 생성 후 Activity에서 사용하는 방법으로 진행해보도록 하겠습니다.

 

우선 제가 만들 테이블은 간단하게

 

(이름, 성, 핸드폰 번호)를 칼럼으로 갖는 테이블을 만들고 사용해보도록 하겠습니다.

 

저는 아래 사진과 같이 패키지 내부에 SQLite라는 폴더를 생성한 후

 

SQLiteControl / SQLiteHelper 두 개의 Java 파일을 생성하였습니다.

 

위와 같이 생성하셨다면 SQLiteHelper.java 파일을 먼저 코딩해보도록 하겠습니다.

 

우선 SQLiteHelper에 아래 사진과 같이 android.database.sqlite.SQLiteOpenHelper를 상속해줍니다.

 

 

그럼 위와 같이 빨간 밑줄이 쫘~~악! 그어지는데요.

 

몇 가지 Function들을 오버라이드 해주어야 합니다.

 

Ctrl + O 키를 누르면 Override 할 수 있는 함수들이 쭉~ 나올 것입니다.

 

여기서 아래 사진과 같이 생성자, onCreate, onUpgrade를 포함해줍니다.

 

 

해당 함수들을 모두 포함하고 OK를 누르면 자동으로 입력되며,

 

아래와 같이 빨간 줄이 사라집니다!

 

 

그럼 이제 소스를 살펴보겠습니다.

 

먼저 SQLiteHelper.java를 모두 코딩한 소스입니다.

 

SQLiteHelper에서는 DB를 생성, Open 및 버전 Update에 대한 내용을 편리하게 도와주는 Class 입니다.


#### SQLiteHelper.java ####

package com.itkim.exam.sqliteexam.SQLite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import androidx.annotation.Nullable;

public class SQLiteHelper extends android.database.sqlite.SQLiteOpenHelper{

    // 저는 나중에 수정할 때를 대비하여 final 선언을 하였지만 굳이 이렇게 안하셔도 괜찮습니다.
    public final String TABLE_NAME = "itkimtable";
    public final String FIRST_NAME = "f_name";
    public final String LAST_NAME = "l_name";
    public final String PHONENUM = "phoneNum";

    public SQLiteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // Table 생성하는 Query
        // ( if not exists ) 만약 존재하지 않으면 생성
        String create_query = "create table if not exists " + TABLE_NAME + "("
                + FIRST_NAME + " text not null , "
                + LAST_NAME + " text , " // not null을 쓰시지 않으실 때는 이렇게 선언합니다.
                + PHONENUM + " text primary key);"; // primary key는 이렇게 선언합니다.

        // 위 Create Query로 Table을 생성해줍니다.
        sqLiteDatabase.execSQL(create_query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        // SQLite에 대해 설정한 버전을 올렸을 때

        // 기존 테이블 Drop 해준 후
        String drop_query = "drop table " + TABLE_NAME + ";";
        sqLiteDatabase.execSQL(drop_query);

        // onCreate를 호출해서 Table 다시 생성
        onCreate(sqLiteDatabase);
    }
}

 

 

그럼 다음으로 SQLiteHelper.java 소스를 살펴보도록 하겠습니다.


#### SQLiteControl.java ####

package com.itkim.exam.sqliteexam.SQLite;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class SQLiteControl {

    SQLiteHelper helper;
    SQLiteDatabase sqlite;

    // 생성자
    public SQLiteControl(SQLiteHelper _helper){
        this.helper = _helper;
    }

    // DB Insert
    public void insert(String _firstName, String _lastName, String _phoneNum){
        sqlite = helper.getWritableDatabase();
        ContentValues values = new ContentValues();

        values.put(helper.FIRST_NAME, _firstName);
        values.put(helper.LAST_NAME, _lastName);
        values.put(helper.PHONENUM, _phoneNum);

        sqlite.insert(helper.TABLE_NAME, null, values);
    }

    // DB Select
    public String[] select(){
        sqlite = helper.getReadableDatabase();
        // 커서 사용
        Cursor c = sqlite.query(helper.TABLE_NAME, null, null, null,null,null,null);

        // 칼럼 정보를 배열에 넣고
        String[] columnName = {helper.FIRST_NAME, helper.LAST_NAME, helper.PHONENUM};

        // 칼럼 정보와 길이가 같은 배열을 생성 후
        String[] returnValue = new String[columnName.length];

        // 생성한 배열에 데이터를 받아줍니다.
        while(c.moveToNext()){
            for(int i=0 ; i<returnValue.length; i++){
                returnValue[i] = c.getString(c.getColumnIndex(columnName[i]));
                Log.e("DB Select : ",i + " - "+returnValue[i]);
            }
        }
        // 커서를 사용 후에 꼭 닫아줍시다!
        c.close();
        return returnValue;
    }

    // DB Update
    public void update(String _key, String _value, String _phoneNum){
        sqlite = helper.getWritableDatabase();

        ContentValues value = new ContentValues();
        value.put(_key, _value);
        // 제가 phoneNum를 사용한 이유는 포스팅하는 예제 Table의 Primary Key가 phoneNum 이기 때문입니다.
        sqlite.update(helper.TABLE_NAME, value, "phoneNum=?", new String[]{_phoneNum});
    }

    // DB Delete
    public void delete(String _phoneNum){
        sqlite = helper.getWritableDatabase();
        // 제가 phoneNum를 사용한 이유는 포스팅하는 예제 Table의 Primary Key가 phoneNum 이기 때문입니다.
        sqlite.delete(helper.TABLE_NAME, "phoneNum=?", new String[]{_phoneNum});
    }

    // SQLite Close
    public void db_close(){
        sqlite.close();
        helper.close();
    }
}

 

위와 같습니다.

주석을 상세하게 달아놓는다고 노력하긴 했는데 부족한지 모르겠습니다.

 

그럼 이제 위 두 Class를 활용하여 DB를 사용해보도록 하겠습니다.

 

DB를 실질적으로 사용하는 MainActivity의 소스입니다.

 

 


#### MainActivity.java ####

package com.itkim.exam.sqliteexam;

import androidx.appcompat.app.AppCompatActivity;

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

import com.itkim.exam.sqliteexam.SQLite.SQLiteControl;
import com.itkim.exam.sqliteexam.SQLite.SQLiteHelper;

public class MainActivity extends AppCompatActivity {

    SQLiteHelper helper; // 헬퍼 선언
    SQLiteControl sqlite; // 실제로 SQLite를 활용할 Class를 선언합니다.

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

        // DB를 생성 및 Open합니다.
        helper = new SQLiteHelper(
                MainActivity.this, // context
                "dbFileName.db", // DB 파일 이름을 적어주시면 됩니다.
                null, // Factory
                1 // 현재 생성하는 DB의 버전을 설정합니다.
        );

        /*
            제가 SQLiteControl에 helper를 파라미터로 넣어준 이유는 파일을 나누어서 관리하기 위함입니다.
            그냥 Activity에서 모든 작업을 하고 싶으시면 이렇게 나누시지 않아도 괜찮습니다.
         */
        sqlite = new SQLiteControl(helper);

        dbTest();
    }

    private void dbTest(){
        // DB Insert를 하고 Select로 확인합니다.
        dbInsert();
        dbSelect();

        // DB Update를 하고 Select로 확인합니다.
        dbUpdate();
        dbSelect();

        // DB Delete를 하고 닫아줍니다. (DB를 사용 후에는 꼭 닫는 습관을 들이시는게 좋습니다!)
        dbDelete();
        sqlite.db_close();
    }

    private void dbInsert(){
        // Insert 하려는 정보를 파라미터로 넘겨주기만 하면 Insert 됩니다.
        sqlite.insert("군", "김", "010-0000-0000");
    }

    private void dbSelect(){
        // 아까 SQLiteControl에서 배열로 넘겨주었기 때문에 sqlite.select()를 배열로 받아줍니다.
        String[] selectData = sqlite.select();

        // 배열로 받은 정보를 로그로 확인합니다.
        for(int i=0; i>selectData.length; i++){
            Log.i("@@ Select DB : ", selectData[i]);
        }
    }

    private void dbUpdate(){
        // update 해야 할 column명, 변경할 값, where조건 이지만 간단 예제이기때문에 primary Key를 사용했습니다.
        sqlite.update(helper.FIRST_NAME, "김군", "010-0000-0000");
        sqlite.update(helper.LAST_NAME, "IT", "010-0000-0000");
    }

    private void dbDelete(){
        // delete 해야 할 정보 primary Key를 파라미터로 전달
        sqlite.delete("010-0000-0000");
    }
}

 

위와 같이 진행했을 시 결과 값은 아래와 같습니다.

 

 

처음에 군, 김, 010-0000-0000 이라는 정보를 Insert 후 Select한 정보가 위 3줄입니다.

 

그리고 "군 -> 김군" 으로 "김 -> IT"로 Update 후 Select한 정보가 아래 3줄입니다.

 

혹시나 보시고 어려운 부분이나 보시기 불편한 부분 있으시면 꼭 댓글로 저에게 가르침을 부탁드립니다.

 

혹은 반대로 정말 도움이 많이 되셨다면 공감 한 번 씩만 부탁드리겠습니다.

 

그럼 오늘은 여기까지 메모해보도록 하겠습니다.

 

다들 굿밤되세요!


WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,