일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Abstract Factory
- 디자인패턴
- 추상 팩토리
- Singleton
- PrototypePattern
- builderPattern
- Functional Programming
- Kotlin
- 디자인패턴 #
- 코틀린
- 추상팩토리패턴
- 함수형프로그래밍
- 싱글톤
- Observer Pattern
- factory method
- 옵저버 패턴
- El
- r
- a
- ㅋㅁ
- ㅓ
- F
- 빌터패턴
- designPattern
- 프로토타입 패턴
- 팩토리 메소드
- Design Pattern
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Realm models 본문
Realm 모델 클래스는 public, protected, private 필드와 커스텀 메서드를 지원합니다.
1. 모델클래스와 기본 설정
open class User(
var name: String = "",
var age: Int = 0,
@Ignore
var sessionId: Int = 0
): RealmObject() {
fun hasLongName(): Boolean {
return name.length > 7
}
}
@Required null 값을 가질 수 없는 field
String 및 Date와 같은 nullable 형식만 @Required로 주석을 달 수 있습니다.
원시 타입 및 RealmList 유형인 필드는 암시적으로(기본적으로) @Required .
RealmObject 유형의 필드는 항상 nullable입니다.
@PrimaryKey
기본키 필드를 설정합니다.
String 및 원시 타입만 가능하다.
문자열 필드를 기본 키로 지정하면 필드가 자동으로 인덱싱 됩니다.
문자열의 @PrimaryKey 주석은 암시 적으로 @Index 주석을 설정합니다.
* 단일키만 사용 가능하고 2개의 필드를 기본키로 설정할 수 없다.
기본 키를 사용하면 copyToRealmOrUpdate 또는 insertOrUpdate 메서드를 사용할 수 있습니다.
이들은 주어진 기본 키값과 일치한 객체를 찾고 업데이트하거나 (해당 키가 있는 객체가 이미 있는 경우) 생성 (키가 없는 경우)합니다.
기본 키가없는 클래스에서 copyToRealmOrUpdate 또는 insertOrUpdate를 호출하면 예외가 발생
기본 키를 사용하면 읽기(select (쿼리))가 약간 빨라지지만 쓰기 insert/update(객체 생성 및 업데이트)는 약간 느려집니다.
성능 변화는 Realm의 데이터 세트 크기에 따라 달라집니다.
Realm.createObject는 모든 필드가 기본값으로 설정된 새 객체를 반환합니다.
객체가 기본 키가있는 클래스인 경우 충돌이 발생할 수 있습니다. 해당 기본 키가 이미 설정된 객체가 있을 수 있습니다.(동일한 기본키 충돌)
이를 방지하려면 관리되지 않는 개체를 만들고 해당 필드 값을 설정 한 다음 copyToRealm을 사용하여 Realm에 추가한다.
문자열 유형 또는 Wapper/Boxing 정수 (Byte, Short, Integer 및 Long) 인 기본 키는 @PrimaryKey 주석이 @Required와 결합되지 않는 한 null 값을 가질 수 있습니다.
@Index 인덱싱 할 필드에 선언
기본 키와 마찬가지로 쓰기 속도는 약간 느려지지만 읽기 속도는 더 빨라집니다. (또한 인덱스를 저장하기 위해 Realm 파일을 약간 더 크게 만듭니다.)
특정 상황에서 읽기 성능을 최적화 할 때만 인덱스를 추가하는 것이 가장 좋습니다.
String, Byte, Short, Int, Long, Boolean 및 Date 필드를 인덱싱 할 수 있습니다.
@Ignore
모델의 필드를 Realm에 저장하지 않을 때 사용.
입력에 모델보다 더 많은 필드가 포함되어 있고 사용하지 않는 데이터에 관한 필드를 선호하지 않을 때.
정적 및 임시로 표시된 필드는 항상 무시되며 @Ignore 주석이 필요하지 않습니다.
2. 이름 정책 관련 주석
@RealmModule, @RealmClass or @RealmField
이름 오버 라이딩한다.
위 주석이 없을 경우 모델 클래스를 기반으로 이름을 생성한다.
모듈 수준에서 이름 지정 정책을 정의하여 모듈의 모든 클래스 부분에 영향을 준다.
@RealmModule(
allClasses = true,
classNamingPolicy = RealmNamingPolicy.LOWER_CASE_WITH_UNDERSCORES,
fieldNamingPolicy = RealmNamingPolicy.LOWER_CASE_WITH_UNDERSCORES
)
class MyModule {
// ...
}
클래스의 사용자 지정 이름 또는 해당 클래스의 모든 필드에 영향을 주는 필드 이름 지정 정책을 정의합니다.
이는 모듈 수준 설정을 재정의합니다.
@RealmClass(name = "__Person", fieldNamingPolicy = RealmNamingPolicy.PASCAL_CASE)
open class Person(
var name: String? = null
): RealmObject()
필드에 대한 사용자 정의 이름을 정의할 수 있으며 이는 클래스 및 모듈 수준 설정을 재정의합니다.
open class(
@RealmField(name = "person_name")
var name: String? = null
): RealmObject()
내부 이름을 변경해도 JSON에서 데이터를 가져오는 데는 영향을 주지 않습니다.
JSON 데이터는 Realm Kotlin 클래스에 정의된 이름을 따라야 합니다.
Moshi, GSON 또는 Jackson과 같은 표준 라이브러리를 사용하여 JSON을 파싱 할 때 이러한 라이브러리는
JSON에서 Kotlin으로의 변환을 정의한다.
내부 Realm 이름을 설정하면 Kotlin에서 Realm 파일로의 변환이 정의된다는 점을 기억하는 것이 중요합니다.
즉, 이러한 라이브러리를 사용하여 JSON에서 Realm으로 데이터를 가져오려면 JSON 파서 라이브러리와 Realm 모두에서 주석을 제공해야 합니다.
Json(@Json 입력된 제이슨 필드 이름)---> kotlin 필드(클래스명) ---> realm (@RealmField 내부 Realm 저장될 필드 이름)
open class Person(
@Json(name = "first_name") // Name used in JSON input.
@RealmField(name = "first_name") // Name used internally in the Realm file.
var firstName: string? = null // name used in Kotlin
): RealmObject()
3. counters
Realm은 MutableRealmInteger를 특별한 Integer 유형으로 제공합니다.
MutableRealmInteger는 동기화된 Realm을 사용할 때 의도를 보다 명확하게 표현하고 더 나은 충돌 해결을 생성할 수 있는 추가 API를 제공한다.
또한, MutableRealmInteger는 기존 정수 유형을 지원하기 때문에 필드를 byte, short, int 또는 long에서 MutableRealmInteger로 변경이 필요하지 않습니다.
MutableRealmInteger는 Kotlin의 기본 Number와 같은 불변 타입이 아닙니다.
일반적으로 Counters는 값을 읽고 증가시켜 저장한다.
myObj.counter + = 1 이 코드는 비동기 상황에서 잘 작동하지 않습니다.
두 개 클라이언트가 오프라인 일 때 — 둘 다 값 (예 : 10)을 읽고 증가한 다음 값을 11로 저장한다면,
나중에 다시 db와 연결될 때 변경사항을 반영하려고 하면 카운터가 예상되는 12가 아니라 11로 저장되는 문제가 발생한다.
RealmObject, RealmResults 및 RealmList와 같은 LiveObject입니다.
Realm이 쓰일 때 MutableRealmInteger 안에 포함된 값이 변경될 수 있음을 의미합니다.
그래서 MutableRealmInteger 필드는 final로 표시되어야 합니다.
open class Party(
var guests: MutableRealmInteger = MutableRealmInteger.valueOf(0)
): RealmObject()
val party = realm.where<Party>().findFirst()!!
realm.executeTransaction {
party.guests.get() // 0
party.guests.increment(1) // 1
party.guests.decrement(1) // 0
party.guests.increment(5) // 5
party.guests.decrement(1) // 4
}
위와 같이 그냥 증가 감소 메서드만 호출한다면 바로 DB에 적용이 된다.
카운터를 재설정하려면 counter.set ()을 사용하여 새 값을 할당할 수 있습니다.
set () 호출은 다른 장치 pr에서 오는 increment () 및 decrement () 작업을 재정의 할 수 있다.
최근에 쓰인 것 우선 병합 규칙이므로 손실 카운터가 허용되는 경우에만 사용한다.
4. RealmObject와 RealmModel
@RealmObject를 상속받아서 모델을 만들 수도 있지만, RealmModer 인터페이스를 구현하여 모델을 만들수도 있다.
이 경우 RealmObject의 대부분의 static 메소들 사용할 수 있다.
@RealmClass
open class User : RealmModel {
// ...
}
open class User(){
// ...
}: RealmObject
// With RealmObject
user.isValid();
user.addChangeListener(listener);
// With RealmModel
RealmObject.isValid(user);
RealmObject.addChangeListener(user, listener);
'Android Realm' 카테고리의 다른 글
Realm (In-Memory Realms) (0) | 2022.11.18 |
---|---|
Realms init(초기화) (0) | 2021.02.17 |
Realm 이란? (0) | 2021.02.16 |