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
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] 사람 이미지 배경 가리기 PorterDuff.Mode (0) | 2023.12.13 |
---|---|
[Android][Java] 버튼 클릭으로 소리 출력하기 (0) | 2023.12.10 |
[JAVA][Android] 지문인식 기능 만들기 (0) | 2023.11.30 |
[JAVA][Android] QR코드 스캐너 만들기 (0) | 2023.11.20 |
[Android][Java] 네이버지도 API 반경표현 (0) | 2023.11.15 |