자바 안드로이드 앱개발 강좌, 데이터베이스에 보관하기

안드로이드 애플리케이션 개발에서 데이터 저장은 필수적인 요소입니다. 사용자의 데이터를 안전하게 보관하기 위해 다양한 저장 방식을 사용할 수 있지만, 그 중에서도 데이터베이스가 가장 보편적으로 사용됩니다. 이번 글에서는 안드로이드에서 자바를 활용하여 SQLite 데이터베이스를 생성하고 데이터를 CRUD(생성, 읽기, 업데이트, 삭제)하는 방법을 자세히 알아보겠습니다.

1. 데이터베이스란?

데이터베이스는 정보를 조직적으로 저장 및 관리하는 시스템입니다. 안드로이드에서는 주로 관계형 데이터베이스인 SQLite를 사용합니다. SQLite는 경량형 데이터베이스로, 소형 애플리케이션에 적합하며, 파일 기반으로 동작하여 별도의 서버 없이 간단하게 사용할 수 있습니다.

2. SQLite 데이터베이스 설정하기

안드로이드 프로젝트를 생성한 후, SQLite 데이터베이스를 설정해야 합니다. 데이터베이스를 생성하고 관리하기 위한 헬퍼 클래스를 작성하는 것이 일반적입니다.

package com.example.myapp.database;

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

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "myApp.db";
    public static final String TABLE_NAME = "users";
    
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_EMAIL = "email";

    private static final String TABLE_CREATE =
            "CREATE TABLE " + TABLE_NAME + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME + " TEXT, " +
            COLUMN_EMAIL + " TEXT);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(TABLE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

3. 데이터 삽입하기

데이터를 데이터베이스에 추가하기 위해서는 SQLiteDatabase 객체를 사용하여 insert() 메소드를 호출합니다. 아래 예제는 사용자 정보를 데이터베이스에 추가하는 방법을 보여줍니다.

package com.example.myapp.database;

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

public class UserRepository {
    private DatabaseHelper dbHelper;

    public UserRepository(Context context) {
        dbHelper = new DatabaseHelper(context);
    }

    public void addUser(String name, String email) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_NAME, name);
        values.put(DatabaseHelper.COLUMN_EMAIL, email);

        db.insert(DatabaseHelper.TABLE_NAME, null, values);
        db.close();
    }
}

4. 데이터 조회하기

저장된 데이터를 조회하기 위해서는 query() 메소드를 사용합니다. 이 메소드는 Cursor 객체를 반환하며, Cursor를 통해 데이터에 접근할 수 있습니다.

package com.example.myapp.database;

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

import java.util.ArrayList;
import java.util.List;

public class UserRepository {
    // ... (기존 코드)

    public List getAllUsers() {
        List users = new ArrayList<>();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        
        Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, null, null, null, null, null, null);
        
        if (cursor.moveToFirst()) {
            do {
                User user = new User();
                user.setId(cursor.getInt(cursor.getColumnIndex(DatabaseHelper.COLUMN_ID)));
                user.setName(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_NAME)));
                user.setEmail(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_EMAIL)));
                users.add(user);
            } while (cursor.moveToNext());
        }
        
        cursor.close();
        db.close();
        return users;
    }
}

5. 데이터 업데이트하기

기존 데이터를 업데이트하는 방법은 update() 메소드를 사용합니다. 아래 예에서는 특정 사용자의 이메일을 변경하는 방법을 보여 줍니다.

package com.example.myapp.database;

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

public class UserRepository {
    // ... (기존 코드)

    public void updateUser(int id, String email) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_EMAIL, email);

        db.update(DatabaseHelper.TABLE_NAME, values, DatabaseHelper.COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
    }
}

6. 데이터 삭제하기

특정 데이터를 삭제하려면 delete() 메소드를 사용합니다. 아래 예제에서는 특정 사용자 데이터를 삭제하는 방법을 설명합니다.

package com.example.myapp.database;

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

public class UserRepository {
    // ... (기존 코드)

    public void deleteUser(int id) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper.COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
    }
}

7. 전체 코드 예제

위의 모든 메소드를 포함한 전체 예제를 아래와 같이 최종적으로 컴파일할 수 있습니다.

package com.example.myapp.database;

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

import java.util.ArrayList;
import java.util.List;

public class UserRepository {
    private DatabaseHelper dbHelper;

    public UserRepository(Context context) {
        dbHelper = new DatabaseHelper(context);
    }

    public void addUser(String name, String email) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_NAME, name);
        values.put(DatabaseHelper.COLUMN_EMAIL, email);

        db.insert(DatabaseHelper.TABLE_NAME, null, values);
        db.close();
    }

    public List getAllUsers() {
        List users = new ArrayList<>();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        
        Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, null, null, null, null, null, null);
        
        if (cursor.moveToFirst()) {
            do {
                User user = new User();
                user.setId(cursor.getInt(cursor.getColumnIndex(DatabaseHelper.COLUMN_ID)));
                user.setName(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_NAME)));
                user.setEmail(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_EMAIL)));
                users.add(user);
            } while (cursor.moveToNext());
        }
        
        cursor.close();
        db.close();
        return users;
    }

    public void updateUser(int id, String email) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_EMAIL, email);

        db.update(DatabaseHelper.TABLE_NAME, values, DatabaseHelper.COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
    }

    public void deleteUser(int id) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper.COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
    }
}

8. 종합 및 결론

이번 강좌를 통해 안드로이드에서 SQLite 데이터베이스를 사용하여 기본적인 CRUD 작업을 수행하는 방법을 배웠습니다. 데이터베이스는 앱에서 데이터를 관리하는 데 필수적인 역할을 하며, SQLite는 특히 안드로이드 환경에서 많이 사용됩니다. 더 복잡한 데이터 저장소가 필요한 경우 Room Persistence Library를 사용하는 것도 고려할 수 있습니다. Room은 SQLite 데이터베이스에 대한 추상화 레이어를 제공하여 데이터베이스 작업을 더 쉽게 만들어줍니다.

9. 추가 자료 및 참고 링크