개발/안드로이드 어플

[Android] 데이터베이스 SQLite를 쉽게 작성

외노자개발 2022. 12. 17. 13:24
반응형

 

 

 

대용량 데이터를 읽고 쓰고 더 검색하려는 경우 데이터베이스가 편리하며 Android에서는 SQLite를 사용합니다. 여기에서는 간단한 예를 보겠습니다.

 

SQLite


SQLite의 데이터는 표와 같은 구조로 관계(Relation)라고 하는 개념으로 모델화되어 있습니다. 예를 들어 기업의 주가가 이와 같이 데이터베이스화된다고 가정하면

 

번호 기업명 주가(USD)
001 Apple 217
002 Google 1105년
003 아마존 1764년
004 Microsoft 108
 

 

이러한 데이터베이스를 SQLite로 만들어 Android로 표시해 봅시다.

 

SQLiteOpenHelper


 
데이터베이스 작성, 데이터 추가 및 삭제 등을 관리하기 위해 SQLiteOpenHelper 클래스가 있습니다. 이것을 상속받은 클래스를 만드는 곳에서 시작합니다. 예를 들어 SQLiteOpenHelper를 상속한 TestOpenHelper라는 클래스를 만듭니다.
 

 

public class TestOpenHelper extends SQLiteOpenHelper {
    
    // 데이터베이스의 버전
    private static final int DATABASE_VERSION = 1;
    // 데이터베이스 명
    private static final String DATABASE_NAME = "TestDB.db";
 
    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + TABLE_NAME + " (" +
                    _ID + " INTEGER PRIMARY KEY," +
                    COLUMN_NAME_TITLE + " TEXT," +
                    COLUMN_NAME_SUBTITLE + " INTEGER)";
 
    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + TABLE_NAME;
 
    // 생성자
    TestOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // context: 컨택스트
        // DATABASE_NAME: 데이터베이스 파일명
        // factory: 팩토리
        // DATABASE_VERSION: 데이터베이스 버전
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 테이블 작성
        db.execSQL(
            SQL_CREATE_ENTRIES
        );
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, 
                    int oldVersion, int newVersion) {
        // 업데이트 판별 구버전은 삭제해서 신규작성
        if(db != null){
            db.execSQL( SQL_DELETE_ENTRIES );
            onCreate(db);
        }
    }
 
    public void onDowngrade(SQLiteDatabase db, 
                    int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

 

 

onCreate() 로 테이블을 작성해, 버젼을 올리면 onUpgrade() 로 신규 버젼의 테이블이 작성되어 버전 업합니다.

TestDB.db는
/data/data/[your.package.name]/database/
아래에 작성되었습니다.

 

 

 

데이터베이스 작성 및 삭제



테이블 작성이나 업데이트의 판별의 execSQL() 에는 SQL문으로 실행문을 캐릭터 라인으로 넣어 지정합니다. 예를 들어 SQL_CREATE_ENTRIES 는 이와 같이 설명합니다.
 

"CREATE TABLE testdb ( _id INTEGER PRIMARY KEY, items TEXT, "+ 
"price INTEGER)"

이것을 범용성과 의미를 알 수 있도록 정리하면 이렇게 됩니다. (주) 문장이므로 공간은 의미가 있으므로 지워지지 않도록

 

private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + TABLE_NAME + " (" +
            _ID + " INTEGER PRIMARY KEY," +
            COLUMN_NAME_TITLE + " TEXT," +
            COLUMN_NAME_SUBTITLE + " INTEGER)";

마찬가지로 SQL_DELETE_ENTRIES 도 이와 같이 다시 작성됩니다.

private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + TABLE_NAME;

 

 

데이터 추가



데이터의 기입은 execSQL() (을)를 사용할 수도 있습니다만, ContentValue 를 사용해 맵 데이터형의 key 와 value 로서 취급하는 것도 가능합니다.

public void saveData(SQLiteDatabase db, String item, int price){
    ContentValues values = new ContentValues();
    values.put("items", item);
    values.put("price", price);
 
    db.insert("testdb", null, values);
}

 

 

데이터 읽기



읽기는 query() 메서드를 사용합니다. 실제로 여기에서는 테이블명과 칼럼명의 배열을 설정하는 것만으로 간단한 것으로 만들었습니다.

 

Cursor cursor = db.query(
        TABLE_NAME,   // The table to query
        projection,   // The array of columns to return (pass null to get all)
        selection,    // The columns for the WHERE clause
        selectionArgs,// The values for the WHERE clause
        null,         // don't group the rows
        null,         // don't filter by row groups
        sortOrder     // The sort order
);

 

샘플 코드



정리해 보겠습니다. EditText에서 데이터를 입력하여 데이터베이스를 만듭니다. TestOpenHelper.java
 

//package your.package.name;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
public class TestOpenHelper extends SQLiteOpenHelper {
 
    // 데이터베이스 버전
    private static final int DATABASE_VERSION = 1;
 
    // 데이터베이스 명
    private static final String DATABASE_NAME = "TestDB.db";
    private static final String TABLE_NAME = "testdb";
    private static final String _ID = "_id";
    private static final String COLUMN_NAME_TITLE = "company";
    private static final String COLUMN_NAME_SUBTITLE = "stockprice";
 
    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + TABLE_NAME + " (" +
                    _ID + " INTEGER PRIMARY KEY," +
                    COLUMN_NAME_TITLE + " TEXT," +
                    COLUMN_NAME_SUBTITLE + " INTEGER)";
 
    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + TABLE_NAME;
 
 
    TestOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
 
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
 
        // 테이블 작성
        // SQLite파일이 없으면SQLite파일이 작성됨
        db.execSQL(
                SQL_CREATE_ENTRIES
        );
 
        Log.d("debug", "onCreate(SQLiteDatabase db)");
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 업데이트 판별
        db.execSQL(
                SQL_DELETE_ENTRIES
        );
        onCreate(db);
    }
 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

 

Activity에서 Context를 SQLiteOpenHelper를 상속한 TestOpenHelper에 전달하여 데이터베이스를 만듭니다. 읽기를 버튼으로 데이터베이스에서 읽기 표시합니다.
MainActivity.java

 

//package your.package.name;
 
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
 
    private TextView textView;
    private EditText editTextKey, editTextValue;
    private TestOpenHelper helper;
    private SQLiteDatabase db;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        editTextKey = findViewById(R.id.edit_text_key);
        editTextValue = findViewById(R.id.edit_text_value);
 
        textView = findViewById(R.id.text_view);
 
        Button insertButton = findViewById(R.id.button_insert);
        insertButton.setOnClickListener(v -> {
 
            if(helper == null){
                helper = new TestOpenHelper(getApplicationContext());
            }
 
            if(db == null){
                db = helper.getWritableDatabase();
            }
 
            String key = editTextKey.getText().toString();
            String value = editTextValue.getText().toString();
 
            // 가격은 정수
            insertData(db, key, Integer.parseInt(value));
        });
 
        Button readButton = findViewById(R.id.button_read);
        readButton.setOnClickListener(v -> readData());
    }
 
 
    private void readData(){
        if(helper == null){
            helper = new TestOpenHelper(getApplicationContext());
        }
 
        if(db == null){
            db = helper.getReadableDatabase();
        }
        Log.d("debug","**********Cursor");
 
        Cursor cursor = db.query(
                "testdb",
                new String[] { "company", "stockprice" },
                null,
                null,
                null,
                null,
                null
        );
 
        cursor.moveToFirst();
 
        StringBuilder sbuilder = new StringBuilder();
 
        for (int i = 0; i < cursor.getCount(); i++) {
            sbuilder.append(cursor.getString(0));
            sbuilder.append(": ");
            sbuilder.append(cursor.getInt(1));
            sbuilder.append("\n");
            cursor.moveToNext();
        }
 
        // 잊지말고 close
        cursor.close();
 
        Log.d("debug","**********"+sbuilder);
        textView.setText(sbuilder.toString());
    }
 
    private void insertData(SQLiteDatabase db, String com, int price){
 
        ContentValues values = new ContentValues();
        values.put("company", com);
        values.put("stockprice", price);
 
        db.insert("testdb", null, values);
    }
}
반응형