앞선 포스팅에서는 Internal/External 저장소에 사용자의 데이터를 저장하는 방법에 대해 살펴 보았습니다.
오늘은 데이터베이스를 활용하여 원하는 데이터를 저장하는 방법에 대해 알아보겠습니다.
Intenrnal/External 저장소에 저장하는 것 보다 데이터베이스를 이용하여 저장할 때는, 동일한 형태의 데이터를 저장할 수 있다는 점에서 더 편리합니다.
회원정보를 저장할 경우가 대표적인 예인데, 이 경우 회원의 이름, 성별, 전화번호, 주소 등등이 각각 DB의 속성(Attribute) 가 될 것이고,
실제 들어가는 데이터 (김태희, 여, 010-0000-0000, 경기도.. ) 들이 값(Value) 이 될 것입니다.
1. SQLiteOpenHelper 를 이용한 DB 생성
SQLiteOpenHelper Class 는 Database 를 생성하고 해당 Database 의 Version 을 관리합니다.
해당 Class 를 사용하기 위해서 Database가 처음 생성될 때 불리는 onCreate(..) 와 Database 가 Upgrade 될 경우에 불리는 onUpgrade(..) callback method 를 구현해 주어야 하며, 필요에 따라 onOpen(..) 함수와 onDowngrade(..) 함수도 구현하여 사용할 수 있습니다.
저는 SQLiteOpenHelper를 상속 받은 MySQLiteOpenHelper 를 생성해서 간단하게 onCreate/onUpgrade 만 구현해 주었습니다.
public class MySQLiteOpenHelper extends SQLiteOpenHelper { private final String TAG = "MySQLiteOpenHelper"; public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { String sql = "create table student (_id integer primary key autoincrement, name text, age integer, address text)"; sqLiteDatabase.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { String sql="drop table if exists student"; sqLiteDatabase.execSQL(sql); onCreate(sqLiteDatabase); } }
onCreate 에서는 Database를 생성해 주었고, 각 Field 는 name, age, address 로 구성될 수 있도록 하였습니다.
"create table student (_id integer primary key autoincrement, name text, age integer, address text)";
위 Query 로 DB생성 후 실제 만들어진 DB 를 열어보면 다음과 같이 data 가 저장됩니다.
그리고 onUpgrade 함수에는 현재 생성되어있는 Database 를 지우고 onCreate 를 통해 다시 생성될 수 있도록만 구현을 해 두었습니다.
2. DB에 데이터 삽입 및 삭제
DB에 데이터 삽입/삭제를 위해 MyDBHandler 클래스를 생성하였습니다.
MyDBHandler 클래스에서는 DBActivity 로 부터 사용자 정보를 받아 MySQLiteOpenHelper 로 전달 합니다.
데이터를 저장 할 때 ContentValues 를 이용했는데, ContentValues 는 Data 를 Key와 Value의 Set 으로 저장할 수 있습니다.
그래서 Database 에 값을 줄때 "name, 홍길동" ,"age, 24" 등과 같이 Key 와 Value 의 형태로 쉽게 전달 가능합니다.
public class MyDBHandler { private final String TAG = "MyDBHandler"; SQLiteOpenHelper mHelper = null; SQLiteDatabase mDB = null; public MyDBHandler(Context context, String name) { mHelper = new MySQLiteOpenHelper(context, name, null, 1); } public static MyDBHandler open(Context context, String name) { return new MyDBHandler(context, name); } public Cursor select() { mDB = mHelper.getReadableDatabase(); Cursor c = mDB.query("student", null, null, null, null, null, null); return c; } public void insert(String name, int age, String address) { Log.d(TAG, "insert"); mDB = mHelper.getWritableDatabase(); ContentValues value = new ContentValues(); value.put("name", name); value.put("age", age); value.put("address", address); mDB.insert("student", null, value); } public void delete(String name) { Log.d(TAG, "delete"); mDB = mHelper.getWritableDatabase(); mDB.delete("student", "name=?", new String[]{name}); } public void close() { mHelper.close(); } }
select 함수는 Database 의 전체 내용을 return 해주고, insert/delete 함수는 각각 Database에 데이터를 추가/삭제 시 호출 됩니다.
delete 의 경우 name 을 인자로 받아서 이름이 동일 하면 해당 row 를 모두 삭제하도록 하였습니다.
3. 동작 확인
기존에 작성하였던 MainActivity 에 Database 버튼을 하나 추가한다음에, 이 버튼을 눌렀을 때 Activity 를 전환하여 Database 의 내용을 뿌려주도록 하였습니다.
가장 상단에는 Database 에 내용을 추가할 수 있도록 Editbox 를 3개 두었고, 각각 이름/나이/주소 정보를 저장할 수 있도록 하였습니다.
Update Database 를 누르게 되면 Editbox 에 추가한 내용이 Database 에 업데이트 되고 리스트의 내용이 업데이트 됩니다.
리스트의 각 항목을 롱클릭 하게 되면 해당 Field 가 삭제 됩니다. ^^
여기까지 Database 를 이용한 아주 간단한 사용자 데이터 저장에 대해서 살펴보았습니다.
모든 소스는 https://github.com/bettercho/MyGithub/tree/master/storeuserdata 를 참고하시면 됩니다.
'Android > 기본 개념' 카테고리의 다른 글
해상도 별 이미지 생성 및 적용 방법 (0) | 2023.07.15 |
---|---|
Android NFC 기본 개념 및 활용 분야 (0) | 2018.03.06 |
open failed: EACCES (Permission denied) 해결 방법 (0) | 2018.02.11 |
Android StrictMode로 Thread 감지하기 (0) | 2018.02.01 |
Android 데이터 저장 방법 - Internal/External Storage (0) | 2018.01.28 |