CRUD - Java SDK
이 페이지의 내용
쓰기 작업
영역에서 객체를 생성 하고, 객체를 업데이트 하고, 최종적으로 영역에서 객체를 삭제할 수 있습니다. 이러한 작업은 영역의 상태를 수정하기 때문에 쓰기 작업이라고 합니다.
Realm은 트랜잭션 측면에서 쓰기를 처리합니다. 트랜잭션은 Realm이 분할할 수 없는 단일 작업으로 처리하는 읽기 및 쓰기 작업 목록입니다. 다시 말해, 트랜잭션은 전부 아니면 아무것도 아닙니다: 트랜잭션의 모든 작업이 성공하거나 트랜잭션의 작업 중 어느 것도 적용되지 않습니다.
참고
모든 쓰기는 트랜잭션에서 이루어져야 합니다.
영역은 한 번에 하나의 쓰기 트랜잭션 (write transaction)만 허용합니다. Realm은 열린 트랜잭션이 완료될 때까지 다른 스레드에서 다른 쓰기를 차단합니다. 따라서 트랜잭션 내의 영역에서 값을 읽을 때 경쟁 상태가 없습니다.
트랜잭션이 완료되면 Realm은 트랜잭션을 커밋 하거나 취소 합니다.
Realm은 트랜잭션을 커밋 하면 모든 변경 사항을 디스크에 씁니다. 동기화된 영역의 경우 Realm은 Atlas App Services와의 동기화를 위해 변경 사항을 대기열에 넣습니다.
Realm이 쓰기 트랜잭션(write transaction)을 취소 하거나 트랜잭션 작업에서 오류가 발생하면 모든 변경 사항이 삭제(또는 "롤백")됩니다.
팁
Realm 객체 쓰기는 파일 쓰기입니다.
Realm 객체를 생성, 업데이트 또는 삭제할 때마다 변경 사항으로 인해 Realm에서 해당 객체의 표현이 업데이트되고 구독한 모든 리스너에게 알림 이 전송됩니다. 따라서 데이터를 유지하는 데 필요한 경우에만 Realm 객체에 기록해야 합니다.
중요
UI 스레드의 동기식 읽기 및 쓰기
기본적으로 비동기 트랜잭션 을 사용하여 애플리케이션의 UI 스레드에 있는 영역에 대한 읽기 또는 쓰기만 가능합니다. 즉, 동기 메서드의 사용을 명시적으로 허용하지 않는 한 Android 애플리케이션의 기본 스레드에서 이름이 Async
(이)라는 단어로 끝나는 Realm
메서드만 사용할 수 있습니다.
이러한 제한은 애플리케이션 사용자를 위해 존재합니다. 즉, UI 스레드에서 읽기 및 쓰기 작업을 수행하면 UI 상호 작용이 응답하지 않거나 느려질 수 있으므로 일반적으로 이러한 작업을 비동기적으로 처리하거나 배경 스레드에서 처리하는 것이 가장 좋습니다. 하지만 애플리케이션이 UI 스레드에서 동기 Realm 읽기 또는 쓰기를 사용해야 하는 경우 다음 SyncConfiguration
옵션을 사용하여 동기 메서드 사용을 명시적으로 허용할 수 있습니다.
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread." ); } });
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.") } })
managed 객체
managed 객체 는 Realm의 기본 데이터 변경에 따라 업데이트되는 live Realm 객체입니다. managed 객체는 열린 영역에서만 가져올 수 있으며 해당 영역이 열려 있는 한 업데이트를 받습니다. managed 객체 는 스레드 간에 전달할 수 없습니다.
관리되지 않는 객체
관리되지 않는 객체 는 라이브가 아닌 Realm 객체의 인스턴스입니다. Realm 객체를 수동으로 생성하거나 Realm.copyFromRealm() 을 호출하여 관리되지 않는 객체를 가져올 수 있습니다. 관리되지 않는 객체 는 스레드 간에 전달될 수 있습니다.
트랜잭션 실행
Realm은 각 트랜잭션을 0개 이상의 읽기 및 쓰기 작업을 포함하는 콜백 함수로 나타냅니다. 트랜잭션을 실행하려면 트랜잭션 콜백을 정의하고 이를 영역의 write
메서드에 전달하세요. 이 콜백 내에서 영역에서 자유롭게 만들고, 읽고, 업데이트하고, 삭제할 수 있습니다. Realm에서 콜백의 코드가 실행할 때 예외가 발생하면 Realm은 트랜잭션을 취소합니다. 그렇지 않으면 Realm은 콜백 직후 트랜잭션을 커밋합니다.
예제
다음 코드는 executionTransaction() 또는 executionTransactionAsync() 를 사용하여 트랜잭션을 실행하는 방법을 보여줍니다. 콜백의 코드에서 예외가 발생하면 Realm은 트랜잭션을 취소합니다. 그렇지 않으면 Realm이 트랜잭션을 커밋합니다.
realm.executeTransaction(r -> { // Create a turtle enthusiast named Ali. TurtleEnthusiast ali = r.createObject(TurtleEnthusiast.class, new ObjectId()); ali.setName("Ali"); // Find turtles younger than 2 years old RealmResults<Turtle> hatchlings = r.where(Turtle.class).lessThan("age", 2).findAll(); // Give all hatchlings to Ali. hatchlings.setObject("owner", ali); });
realm.executeTransaction { r: Realm -> // Create a turtle enthusiast named Ali. val ali = r.createObject(TurtleEnthusiast::class.java, ObjectId()) ali.name = "Ali" // Find turtles younger than 2 years old val hatchlings = r.where(Turtle::class.java).lessThan("age", 2).findAll() // Give all hatchlings to Ali. hatchlings.setObject("owner", ali) }