Realm Blog

Realm Java 0.86 새로운 마이그레이션과 동적 API!

새 버전의 Realm 자바를 웹 사이트와 Maven을 통해 배포하였습니다. 이 릴리스는 예전의 마이그레이션을 대체하는 새로운 구현과 새로운 동적 API를 포함합니다.

마이그레이션 API

마이그레이션은 여전히 RealmConfiguration의 마이그레이션 블록을 명시하지만 인터페이스가 바뀌었습니다. 마이그레이션은 DynamicRealm라고 명명된 새로운 Realm 타입과 동작합니다. DynamicRealm은 전통적인 Realm의 일반적인 객체 생성과 쿼리 능력은 여전히 모두 지원하면서 상호작용과 스키마 변경을 추가로 지원하는 특별한 변형입니다.

RealmMigration migration = new RealmMigration() {
  @Override
  public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

     // DynamicRealm는 편집가능한 스키마를 노출합니다
     RealmSchema schema = realm.getSchema();

     if (oldVersion == 0) {
        // version 1로 마이그레이션 합니다.
        oldVersion++;
     }

     if (oldVersion == 1) {
        // version 2로 마이그레이션 합니다.
        oldVersion++;
     }
  }
}

// 일반적인 마이그레이션 설정입니다
RealmConfiguration realmConfig = new RealmConfiguration.Builder(context)
  .schemaVersion(2)
  .migration(migration)
  .build();

클래스와 필드는 그들의 이름으로 유려하게 참고되고 생성되며 수정됩니다.

RealmSchema schema = realm.getSchema();

// 두개의 필드가 있는 Person을 생성합니다: name과 age
schema.create("Person")
    .addField("name", String.class)
    .addField("age", int.class);

// 특별한 특성의 필드를 생성합니다
schema.get("Person")
    .addField("id", long.class, FieldAttribute.PRIMARY_KEY);

// 다른 Realm 객체를 참조합니다
schema.get("Person")
    .addRealmObjectField("favoriteDog", schema.get("Dog"))
    .addRealmListField("dogs", schema.get("Dog"));

// 마이그레이션 동안 새 데이터를 생성합니다
DynamicRealmObject person = realm.createObject("Person");
person.setString("name", "John");

// 클래스와 그 데이터 전부를 삭제합니다
schema.remove("Person");

모든 RealmObject에서 특정 타입에 해당하는 커스텀 변환기를 실행하는 것도 가능합니다. 이것은 두 타입을 변환하거나 필드를 합치거나 나눌 때 유리합니다.

schema.get("Person")
  .transform(new RealmObjectSchema.Function() {
    @Override
    public void apply(DynamicRealmObject obj) {
      obj.setInt("age", obj.getInt("age") + 1); // 나이 전체에 1씩 더합니다
    }
  });

전체 옵션은 RealmSchemaRealmObjectSchema를 참고하시고 갱신된 마이그레이션 예제도 확인하세요.

동적 API

마이그레이션은 새로운 동적 API를 사용합니다. 이 API는 마이그레이션 밖에서도 사용가능합니다. 예를 들어, 모델이 컴파일 타임에 알려져 있지 않은 상태에서 CSV 파일로부터 데이터를 추출해 데이터를 사용하는 경우 등에서 유용합니다.

동적 Realm을 열 때의 설정은 전통적인 Realm을 사용할 때와 같습니다. 하지만 동적일때는 어떤 스키마, 마이그레이션, 스키마 버전은 무시됩니다.

RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build();
DynamicRealm realm = DynamicRealm.getInstance(realmConfig);

// DynamicRealm에서 모든 객체들은 DynamicRealmObjects입니다
DynamicRealmObject person = realm.createObject("Person");

// 모든 필드는 문자열로 접근가능합니다.
String name = person.getString("name");
int age = person.getInt("age");

// 하부의 스키마는 존재하기에 존재하지 않는 필드에 예외를 발생시킵니다
person.getString("I don't exist");

// 질의는 여전히 평범하게 동작합니다
RealmResults<DynamicRealmObject> persons = realm.where("Person").equalTo("name", "John").findAll();

DynamicRealm은 유언성을 위해 안정성과 성능을 일부 포기합니다. 그렇기 때문에 정말로 유연성이 필요할 때만 사용하세요.

#열거(Enum)가중요해

SortCase 옵션을 지정하기 위해 불린 값을 쓰는 대신 열거(Enum)형을 쓰도록 질의 API를 갱신하였습니다. 이 변화는 더 읽기 좋고 타입 안전한 API를 제공합니다.

realm.where(Person.class)
  .beginsWith("name", "John", Case.INSENSITIVE)
  .findAllSorted("name", Sort.ASCENDING)

전체 변경 상항에서 자세한 내용을 확인하세요.


읽어주어서 감사합니다. Realm과 함께 나아가고 멋진 앱을 만들어 봅시다! 우리는 항상 스택오버플로우, 깃헙, 트위터에서 여러분과 함께합니다.


Realm Team

Realm의 미션은 더 나은 앱을 빠르게 개발할 수 있도록 돕는 것입니다. 이를 위해 저희는 개발자들이 실시간 협업, 가상 현실, 라이브 데이터 동기화, 오프라인 경험, 메시징 등 정교하고 강력한 기능을 쉽게 개발할 수 있도록 하는 개발 도구와 플랫폼을 제공하고 있습니다.

저희는 모바일 인터넷이 수많은 사용자와 보다 많은 디바이스가 속한 개방형 네트워크와 이들 간의 실시간 상호 작용으로 진화할 것이라고 믿으며, 개발자가 이같은 방향으로 발전할 수 있도록 돕기 위해 저희 제품들을 개발하고 있습니다.

이런 개발 뉴스를 더 만나보세요