관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] Realm 데이터베이스 정리 본문

안드로이드/자바 & Previous

[안드로이드] Realm 데이터베이스 정리

막무가내막내 2019. 6. 16. 22:03
728x90

참고 및 출처:

https://realm.io/kr/docs/java/latest/

 

Realm: 리액티브 모바일 애플리케이션을 손쉽고 빠르게 만드세요

Realm Java is the first database built for mobile. An alternative to SQLite and ORMs that's fast, easy to use, and open source.

realm.io

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;
    }

 

728x90
Comments