본문 바로가기
안드로이드 자바

[JAVA][Android] SQLite & Dao 사용하기

by teamnova 2023. 12. 6.
728x90

안드로이드 공식문서를 참고하여 Sqlite를 사용해 보겠습니다. 

 

1. 스키마와 계약(Contract) 클래스 정의하기 

스키마 :  테이블 이름, 필드, 데이터 유형, 그리고 이러한 엔티티 간의 관계 등을 말합니다. 

계약 (Contract) 클래스테이블 및 컬럼의 이름을 정의하는 상수를 유지하는 컨테이너입니다.

Table을 만들고 컬럼명을 적어주는 방식과 똑같습니다. 

 

정리하자면 계약 (Contract) 클래스는 데이터베이스 내의 여러 테이블을 나타내는 내부 클래스를 포함하고 각 내부 클래스는 테이블의 열을 정의합니다. 

public final class DatabaseContract {

    private DatabaseContract() {}

    public static class LoginEntry implements BaseColumns {
        public static final String TABLE_NAME = "your_database_name"; // 테이블 이름
        public static final String COLUMN_NAME_loginId = "loginId"; // 컬럼명
        public static final String COLUMN_NAME_username = "username"; // 컬럼명
    }
}

2. SQL Helper를 사용하여 데이터베이스 생성

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "yourDB"; // 데이터베이스 이름
    private static final int DATABASE_VERSION = 1;



    public DatabaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // 테이블 생성하는 쿼리문
        String CREATE_LOGIN_TABLE =
                "CREATE TABLE " + DatabaseContract.LoginEntry.TABLE_NAME + " (" +
                        DatabaseContract.LoginEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        DatabaseContract.LoginEntry.COLUMN_NAME_loginId + " TEXT NOT NULL, " +
                        DatabaseContract.LoginEntry.COLUMN_NAME_username + " TEXT NOT NULL" +
                        ");";

        sqLiteDatabase.execSQL(CREATE_LOGIN_TABLE); // 쿼리문 실행


    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DatabaseContract.LoginEntry.TABLE_NAME);
        onCreate(sqLiteDatabase);


    }
}

 

1. onCreate : 메소드에서는 데이터베이스가 처음 생성될 때 테이블을 생성해야 합니다.

데이터베이스가 처음 생설될때의 시점은  getWritableDatabase() 메서드를 실행할 때 입니다.

getWritableDatabase()메서드는 데이터베이스가 아직 생성되지 않았다면 onCreate 메소드를 호출하여 

데이터베이스를 만듭니다. 그래서 이때 CREATE TABLE을 사용하여 테이블을 생성합니다. 

 

2. onUpgrade : 이 메소드에서는 데이터베이스 버전이 업그레이드 될때 실행됩니다. 

 

3. Dao클래스 생성 

DAO (Data Access Object) : 데이터베이스의 data에 접근하기 위한 객체입니다. DB에 접근하기 위한 로직을 분리하기 위해 사용됩니다. 

public class LoginDao {

    private SQLiteDatabase db;

    public LoginDao(SQLiteDatabase db) {
        this.db = db;
    }

    /**
     * 사용자 로그인 정보를 데이터베이스에 추가합니다.
     *
     * @param loginId 사용자의 로그인 ID.
     * @param username 사용자의 이름.
     * @return 새로 추가된 로우의 ID를 반환. 오류 발생시 -1.
     */
    public long insert(String loginId, String username) {
        ContentValues values = new ContentValues();
        values.put(DatabaseContract.LoginEntry.COLUMN_NAME_loginId, loginId);
        values.put(DatabaseContract.LoginEntry.COLUMN_NAME_username, username);

        return db.insert(DatabaseContract.LoginEntry.TABLE_NAME, null, values);
    }

    /**
     * 지정된 loginId의 사용자 정보를 수정.
     *
     * @param loginId 수정할 사용자의 로그인 ID.
     * @param newUsername 새로운 사용자 이름.
     * @return 업데이트된 로우의 수를 반환.
     */
    public int update(String loginId, String newUsername) {
        ContentValues values = new ContentValues();
        values.put(DatabaseContract.LoginEntry.COLUMN_NAME_username, newUsername);

        String selection = DatabaseContract.LoginEntry.COLUMN_NAME_loginId + " = ?";
        String[] selectionArgs = { loginId };

        return db.update(DatabaseContract.LoginEntry.TABLE_NAME, values, selection, selectionArgs);
    }

    /**
     * 지정된 loginId의 사용자 정보를 조회.
     *
     * @param loginId 조회할 사용자의 로그인 ID.
     * @return Cursor 객체를 반환. (조회된 결과)
     */
    public Cursor selectByLoginId(String loginId) {
        String selection = DatabaseContract.LoginEntry.COLUMN_NAME_loginId + " = ?";
        String[] selectionArgs = { loginId };

        return db.query(DatabaseContract.LoginEntry.TABLE_NAME, null, selection, selectionArgs, null, null, null);
    }

    /**
     * 지정된 loginId의 사용자 정보를 데이터베이스에서 삭제합니다.
     *
     * @param loginId 삭제할 사용자의 로그인 ID.
     * @return 삭제된 로우의 수를 반환.
     */
    public int delete(String loginId) {
        String selection = DatabaseContract.LoginEntry.COLUMN_NAME_loginId + " = ?";
        String[] selectionArgs = { loginId };

        return db.delete(DatabaseContract.LoginEntry.TABLE_NAME, selection, selectionArgs);
    }
}

 

4. 사용하기 

public class MainActivity extends AppCompatActivity {

    private DatabaseHelper dbHelper;
    private SQLiteDatabase db;
    private LoginDao loginDao;


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

        // DatabaseHelper 초기화
        dbHelper = new DatabaseHelper(this);
        db = dbHelper.getWritableDatabase();
        loginDao = new LoginDao(db);

        // CRUD 함수 실행

        // Insert 예시
        long newRowId = loginDao.insert("exampleLoginId", "exampleUsername");
        if (newRowId != -1) {
            Log.d("MainActivity", "Inserted new row with ID: " + newRowId);
        } else {
            Log.e("MainActivity", "Error inserting new row.");
        }

        // Update 예시
        int updatedRows = loginDao.update("exampleLoginId", "updatedUsername");
        Log.d("MainActivity", "Number of updated rows: " + updatedRows);

        // Select 예시
        Cursor cursor = loginDao.selectByLoginId("exampleLoginId");
        if (cursor != null && cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndex(DatabaseContract.LoginEntry.COLUMN_NAME_username);
            if (columnIndex != -1) {
                String username = cursor.getString(columnIndex);
                Log.d("MainActivity", "Selected username: " + username);
            } else {
                Log.e("MainActivity", "Column not found: " + DatabaseContract.LoginEntry.COLUMN_NAME_username);
            }

            cursor.close();
        }

        // Delete 예시
        int deletedRows = loginDao.delete("exampleLoginId");
        Log.d("MainActivity", "Number of deleted rows: " + deletedRows);
    }

    @Override
    protected void onDestroy() {
        // 데이터베이스 리소스를 제대로 해제
        db.close();
        dbHelper.close();
        super.onDestroy();
    }
}

 

 

 

참고자료

https://developer.android.com/training/data-storage/sqlite?hl=ko#java