티스토리 뷰

Android Realm LocalDataBase (로컬디비 사용하기!!)

안녕하세요. 오늘은 데이터를 저장하기위해 로컬디비를 사용할떄 유용한 Realm Library 를 포스팅 해볼게요~ 


1. Realm 을사용하기위해 Project bulid.gradle 로 이동해주세용.



buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath "io.realm:realm-gradle-plugin:3.1.1"

}
}

allprojects {
repositories {
jcenter()

}
}


2. App build.gradle 로 이동하여서 추가해주세용.

//맨밑 하단영역에 적어주시면됩니당~
apply plugin: 'realm-android'


3. Realm 을 사용할때는 Application 을추가하셔야해용.


3-1  아래와같이 Realm.init(this) 를 불러주시면됩니당.



public class MyApplication extends Application {


@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
}
}


3-2 추가한 Application 을Manifest 에추가합시다.


<application
android:name=".MyApplication"

위와같이 상단에 application에 한줄 추가해주시면됩니다.


4. 준비는 끝낫으니 사용해야겟죠?


Realm 을 사용할때는 해당클래스 자체를 디비에 저장해주는데요.

그러므로, 간단한 클래스 한개하고, Realm 을 사용하게 도와주는 Helper 2개를 만들어보도록 하겠습니다.


4-1 Image Class

public class Image extends RealmObject {
private String imageUrl;

public String getImageUrl() {
return imageUrl;
}

public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}


해당 클래스를 만드실떄는 꼭 extend RealmObject 를 하셔야합니다!! 이후 필요한 변수를 설정해주세요.


4-2 Helper Class


package eyegoodsoft.DB.Image;

import android.app.Activity;
import android.util.Log;

import java.util.ArrayList;

import io.realm.Realm;
import io.realm.RealmResults;

/**
* Created by Junho on 2017-05-15.
*/

public class ImageHelper {
private String returnImageUrl ="";
public void createImage(Realm realm, final String imageUrl) {
Log.e("테스트", "DB생성");
// All writes must be wrapped in a transaction to facilitate safe multi threading
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {

Image image = realm.createObject(Image.class);
image.setImageUrl(imageUrl);

}
});
}

public boolean isCheckClassFile(Realm realm) {
final Boolean[] result = {false};
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Image currentImage = realm.where(Image.class).findFirst();

if (currentImage == null) {
result[0] = false;
} else {
result[0] = true;
}
}
});
return result[0];
}

public String getImageUrl(Realm realm){

realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Image image = realm.where(Image.class).findFirst();
returnImageUrl = image.getImageUrl();
}
});

return returnImageUrl;
}

public void clearImageHelper(Realm realm){
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.delete(Image.class);
}
});
}
}


제가 쓰는 클래스를 그대로 가져온것입니다.


쓰인 함수들을 확인해보자면


public void createImage(Realm realm, final String imageUrl) {
Log.e("테스트", "DB생성");
// All writes must be wrapped in a transaction to facilitate safe multi threading
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {

Image image = realm.createObject(Image.class);
image.setImageUrl(imageUrl);

}
});
}

첫번쨰함수는  DB를 생성해주는 함수입니다.


db 생성은 realm.createObject(해당클래스) 를 이용해주시면 가능하고, 밑에 해당하는 내용을 넣어주세용~


    public boolean isCheckClassFile(Realm realm) {
final Boolean[] result = {false};
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Image currentImage = realm.where(Image.class).findFirst();

if (currentImage == null) {
result[0] = false;
} else {
result[0] = true;
}
}
});
return result[0];
}

두번쨰함수는 파일이 존재하는지 확인하는 함수인데요. return 값을 boolean 을이용해서 사용하구잇죠 ㅎ

realm.where(Image.class).findFirst();

위의 쓰인 코드는 DB에서 첫번쨰값을 가져오라는거에요. 그래서 만약값이 존재한다면 DB에 값이들어간거겟죠??


    public String getImageUrl(Realm realm){

realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Image image = realm.where(Image.class).findFirst();
returnImageUrl = image.getImageUrl();
}
});

return returnImageUrl;
}

세번째함수는 DB에 저장된 이미지를 불러오도록 하는함수입니다.


    public void clearImageHelper(Realm realm){
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.delete(Image.class);
}
});
}

마지막!! 디비삭제해주는 함수에요.


5. 이제 실제적용해봅시당.



public class Test extends AppCompatActivity implements AddInfoView {



private Realm realm;
private ImageHelper imageHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_info);
realm = Realm.getDefaultInstance(); //Realm 을사용하실떄는 꼭 Realm.getDefaultInstance(); 써주셔야합니다!!
ImageHelper imageHelper = new ImageHelper();

// 만약 파일이 존재한다면 전체를 삭제시켜주는 부분입니당 ㅎ
if (imageHelper.isCheckClassFile(realm)){
imageHelper.clearImageHelper(realm);
}

imageHelper.createImage(realm, "이미지 주소");
//위와같이 사용해주시면되고요.

//Realm 을 사용하실떄는 마지막에 꼭 사용해제를 해주셔야합니다!!~ 메모리낭비되요ㅠㅠ


@Override
protected void onDestroy() {
super.onDestroy();
realm.close();
}



이상으로 포스팅을 마치겠습니다:) 감사합니다.

Recent Comments