일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프래그먼트
- 주택가 잠실새내
- 막내의막무가내 플러터 flutter
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 rxjava
- 안드로이드 Sunflower 스터디
- Fragment
- 프로그래머스 알고리즘
- 막내의막무가내
- 막내의막무가내 SQL
- 막내의막무가내 안드로이드
- 막내의막무가내 일상
- 막내의막무가내 코틀린
- flutter network call
- 부스트코스
- 2022년 6월 일상
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 플러터
- 안드로이드
- 막내의 막무가내 알고리즘
- 막무가내
- 주엽역 생활맥주
- 안드로이드 sunflower
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 목표 및 회고
- 막내의 막무가내
- 막내의막무가내 알고리즘
- 부스트코스에이스
- 막내의막무가내 프로그래밍
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] Realm 데이터베이스 정리 본문
참고 및 출처:
https://realm.io/kr/docs/java/latest/
Realm에 대해 간략하게 정리해는 포스팅입니다.
개인적으로 적는거라 정보를 얻으러 오신분들은 다른 블로그 추천드립니당..
처음 안드로이드를 시작할때는 Shared와 SQlite를 사용해봤었는데 Realm도 안드로이드에서 사용할 수 있는 데이터베이스 중 하나입니다. 장점으로는 타 데이터베이스에비해 빠르고 간편하고 ORM방식이란 점이 있습니다.
사용법은 위 사이트에 자세히 나와있으나 제가 해본것들을 간단히 기록만 해보겠습니다.
1. gradle추가
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:3.5.0"
}
}
apply plugin: 'realm-android'
2. DB에 넣을객체 (primaryKey와 RealmObject를 상속받음에 유의!)
public class Diary extends RealmObject { //RealmObject를 extends하여 Relam에 붙여줄수 있는형태가 되게해준다.
@PrimaryKey
int id;
String contents;
Date writeAt;
public Diary() {
}
public Diary(int id, String contents) {
this.id = id;
this.contents = contents;
}
public Diary(int id, String contents, Date writeAt) {
this.id = id;
this.contents = contents;
this.writeAt = writeAt;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public Date getWriteAt() {
return writeAt;
}
public void setWriteAt(Date writeAt) {
this.writeAt = writeAt;
}
}
3. DB 설정 세팅
import android.app.Application;
import io.realm.Realm;
import io.realm.RealmConfiguration;
public class MyDiaryApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("MyDiary.realm") //생성할 realm파일 이름 지정
.schemaVersion(0)
.build();
//Realm에 셋팅한 정보 값을 지정
Realm.setDefaultConfiguration(config);
}
}
Application을 extends 함을 유의! 그리고 이것을 manifest에 등록해주어야한다.
4. Realm 가져오기
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//앱에 설치된 Realm파일을 찾아서 가져오는 코드
realm = Realm.getDefaultInstance();
5. Realm에 저장하기
//Realm에 객체(데이터) 저장
private void addDiary(){
Date date = new Date();
date.setTime(System.currentTimeMillis());
final Diary diary = new Diary(getDiaryId(), getDiaryId() + "번쨰 다이어리", date);
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//Realm에 생성한 다이어리를 저장하는 코드
realm.copyToRealm(diary);
// 저장한 다이어리를 다이어리 리스트에 담아주는코드
diaryList.add(diary);
diaryAdapter.notifyDataSetChanged();
}
});
}
나는 여기서 그냥 Diary 객체를 생성해서 데이터베이스에 저장해주었지만 이렇게도 할 수 있고 다음
밑과 같은 차이점이 있다고 한다. 자세한건 Realm사이트의 '쓰기' 부분을 보면됩니다. 트랜잭션 관리와 디비저장방법 추가자료.(밑)
그리고 나는 excuteTranscation으로 실행을 시켰는데 이거말고도 비동기로 실행하는 방법이있는데 다음과같다. 해당 트랜잭션이 성공했을떄와 실패했을때의 결과응답도 받을 수 있다.
6. Realm로부터 데이터 조작
SELECT
//전체 Diary 목록을 Realm에 요청해서 받아오는 코드입니다
private RealmResults<Diary> getDiaryList(){
//Realm에 저장된 Diary들을 모두 찾아달라고 Realm에 요청해서 받아오는 코드입니다
RealmResults<Diary> diaryRealmResults = realm.where(Diary.class).findAll();
return diaryRealmResults;
}
Diary diary = realm.where(Diary.class).equalTo("id", diaryId).findFirst(); //특정 id가진 데이터불러오기
UPDATE
private void updateDiary(){
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
diary.setContents(diaryEdit.getText().toString());
diary.setWriteAt(writeAt);
//업데이트
realm.copyToRealmOrUpdate(diary);
finish();
}
});
}
DELETE
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Diary deleteDiary = realm.where(Diary.class).equalTo("id", deleteDiaryEvent.getId()).findFirst();
if(deleteDiary != null) {
deleteDiary.deleteFromRealm(); // 자동으로삭제가된다.
}
initDiary();
}
});
7. Realm에는 autoincrement가 없어서 알아서 고유 아이디값을 계산해서 넣어주는데 그를 위한 메서드를 만들어주었다. 디비에 저장된 데이터를 보고 현재 최고 id값의 다음 id값을 부여받게해준다.
//Realm에 저장할 Diary의 ID를 자동으로 증가시켜서 가져오는 메소드
private int getDiaryId() {
//자동으로 Id를 증가시켜야 되기 때문에
//이 메소드가 불린 시점에서 Realm에 저장되어있는 Diary의 ID의 최대값을 구해옵니다.
Number currentId = realm.where(Diary.class).max("id");
//새로 저장할 Diary의 ID값
int nextId;
//Realm에 Diary가 저장되어있지 않아 저장된 ID도 없는 경우에는
if (currentId == null) {
//처음 생성되는 ID이기 때문에 1을 지정합니다
nextId = 1;
//Realm에 Diary가 저장되어있는 경우에는 저장되어 있는 Diary의 최대 ID를 찾아와서
} else {
//찾아온 ID에 +1을 해서 돌려줍니다.
nextId = currentId.intValue() + 1;
}
return nextId;
}
'안드로이드 > 자바 & Previous' 카테고리의 다른 글
[안드로이드] 선택 다이얼로그 (0) | 2019.06.24 |
---|---|
[안드로이드] 버튼 중복클릭 방지하기 (0) | 2019.06.24 |
[안드로이드] otto 라이브러리 ( An event bus by Square ) (0) | 2019.06.16 |
[안드로이드] Spanny 라이브러리 (0) | 2019.06.15 |
[안드로이드] Retrofit2 정리 예제 (19) | 2019.06.14 |