대용량 데이터를 읽고 쓰고 더 검색하려는 경우 데이터베이스가 편리하며 Android에서는 SQLite를 사용합니다. 여기에서는 간단한 예를 보겠습니다.
SQLite
SQLite의 데이터는 표와 같은 구조로 관계(Relation)라고 하는 개념으로 모델화되어 있습니다. 예를 들어 기업의 주가가 이와 같이 데이터베이스화된다고 가정하면
| 번호 | 기업명 | 주가(USD) |
| 001 | Apple | 217 |
| 002 | 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);
}
}'개발 > 안드로이드 어플' 카테고리의 다른 글
| Android 앱 개발에서 ProgressDialog를 추가하는 방법 (0) | 2022.12.22 |
|---|---|
| DialogInterface.OnClickListener 인터페이스 (1) | 2022.12.21 |
| 안드로이드 개발 비동기 처리 "AsyncTask"의 기본 기초 (0) | 2022.12.16 |
| 안드로이드 어플 개발 Context 이용 (0) | 2022.12.13 |
| [안드로이드] Handler 란? 스레드로 View 갱신을 하면 강제 종료! 그럴 때 유용합니다! (0) | 2022.12.08 |
댓글