*데이터의 영구적 지속
SQLite
-네트워크 상태가 아닐 때 stand-alone으로 데이터를 다룰 수 있는 안드로이드 내장 DBMS
-SQLiteDatabase클래스의 함수를 이용
1. SQLiteDatabase db = openOrCreateDatabase("이름", MODE_PRIVATE, null);
2.
db.execSQL(String) : insert, update가 아닌 SQL문
db.rawQuery(String, String[], Object[]) : select문 // 반환값이 Cursor 클래스 (row의 집합 객체)
ex) Cursor cursor = db.rawQuery(~, null);
while (cursor.moveToNext() ) { ~.cursor.getString(0) } // 행 선택 후 getString으로 열 선택
-SQLiteOpenHelper 추상클래스 : 테이블 생성이나 스키마 변경, 상속 받는 서브 클래스 생성
*onCreate와 onUpgrade 재정의 필수
*서브클래스의 생성자 super(context, 'db이름', null, DATABASE_VERSION);
1.
public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
pulbic DBHelper(Context context) {
super(context, 'db이름', null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {} //db 생성 시 호출
@Override
public void onUpgrade(~) {} //db 버전 변경 시 호출, 변경 없으면 호출 X
}
ex)
DBHelper helper = new DBHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
-쿼리문
-insert(), query(), update(), delete() 함수를 직접 이용할 수 있다.
-execSQL()이나 rawQuery()는 SQL문을 직접 매개변수로 줘야하지만, 위의 함수들은 자료만 주면 알아서 SQL문을 생성해준다.
-insert()와 update()는 ContentValues 클래스(insert, update 데이터를 표현하는 집합 객체)를 매개변수로 넘긴다. key-value형식으로 이용되며 key 값이 실제 테이블의 열(column)에 해당한다.
ex)
삽입하기 : ( insert(String table, String nullColumnHack, ContentValues values) )
ContentValues values = new ContentValues();
values.put('name', 'kkang');
values.put('phone', '01012344321');
db.insert('db이름', null, values);
ex)
불러오기 : ( query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) )
Cursor c = db.query("db이름", new String[] {"name", "phone"}, "ID=?", new String[] {"kkang"},
null, null, null); // group by, having, order by
-Realm을 이용한 데이터 영속화
-로컬 데이터베이스, android 표준은 아니고 realm.io에서 배포하는 오픈소스 DBMS
-ORM(Object Relational Mapping)을 제공한다. -> 객체를 RDBMS(관계형 데이터베이스)에 Mapping(적용)해주는 기능
-SQLite보다 빠르다.
-dependencies { classpath "io.realm:real-gradle-plugin:3.5.0"}, apply plugin: 'realm-android'
-Realm 사용 예시
1. VO(Value-Object) 클래스 생성 (다룰 객체의 클래스, 데이터 저장만을 위한 클래스이다.)
ex) public class MemoVO extends RealmObject {
public String title;
public String content;
} //private 선언 후 자료를 getter/setter로 설정해도 무방
*RealmObject를 상속받은 객체를 Realm이 자동 해석하여 데이터 저장하거나 데이터로 객체를 생성한다.
2. Realm 객체 생성
ex
Realm.init(this);
Realm mRealm = Realm.getDefaultInstance();
3. 저장
mRealm.executeTransaction(new Realm.Transaction() ) {
@Override
public void execute(Realm realm) {
MemoVO vo = realm.createObject(MemoVO.class);
vo.title = title;
vo.content = content;
}
});
4. 저장한 데이터 획득
MemoVO vo = mRealm.where(MemoVO.class).equalTo("title", "hello").findFirst();
//클래스가 MemoVO.class이면서 title값이 hello인 데이터 중 첫 번째(findFirst(); ) 데이터를 가져와 vo에 세팅한다.
*mRealm.where()의 반환 객체는 RealmQuery이며, 이 객체에서 findFirst() 말고도 데이터를 추출할 수 있는 다양한 함수 존재. ex) findAllSorted("title", Sort.DESCENDING);
*데이터가 여러 건이면 RealmResults 타입을 이용
RealmResults<MemoVO> results = mRealm.where(Memo.class).equalTo("title", "hello").findAll();
'Programming > Android' 카테고리의 다른 글
10장.AdapterView 활용 (0) | 2020.05.31 |
---|---|
9장.파일 및 SharedPreferences을 이용한 데이터 영속화 (0) | 2020.05.30 |
7장.리소스 활용 및 스마트폰 크기 호환성 (0) | 2020.05.29 |
6장.사용자 이벤트 처리 (0) | 2020.05.29 |
5장.다양한 사용자 알림 효과 (0) | 2020.05.29 |
댓글