3 schwierige Punkte für Java Realm

Realm ist im Allgemeinen nützlich, obwohl es umständlich zu handhaben ist.

Als Prämisse fand ich es umständlich, hauptsächlich mit Realm als einfacher Datenbank umzugehen. Insbesondere ist es im Vergleich zur Swift-Version schwer zu handhaben.

Der Komponententest kann nicht allein mit JVM abgeschlossen werden

Realm hängt von Android ab, also muss ich es mit Android Test ausführen. In diesem Fall können Sie Robolectric verwenden, aber es scheint, dass Realm noch nicht unterstützt wird (https://github.com/realm/realm-java/issues/904).

Das heißt, die Ausführung dauert lange, was das Testen unangenehm macht.

Natürlich kann es mit PowerMock funktionieren, aber ich möchte mit einem Test, der auf Dao abzielt, überprüfen, ob das Einfügen, Aktualisieren und Auswählen im Realm ordnungsgemäß funktioniert. (Für andere Ebenen als Dao wird Dao verspottet, daher gibt es kein Problem.)

Im offiziellen Beispiel, PowerMock Ich benutze.

Derzeit gibt es keine grundlegende Lösung, und es scheint, dass Sie nur testen können, ob die Methode von mock korrekt aufgerufen wird.

Absturz beim Zugriff nach dem Schließen

Es ist natürlich, die Ressource zu öffnen und zu schließen, aber wenn ich auf die Eigenschaft zugreife, um sie in die Entität einzufügen, stürzt sie ab (`` `Diese Realm-Instanz wurde bereits geschlossen```). Java Realm ist eine Spezifikation, auf die nach dem Schließen einer Ressource nicht zugegriffen werden kann.

Um dies zu vermeiden, müssen Sie alles innerhalb der Transaktion abwickeln. Wenn Sie es nur mit Dao abschließen möchten, müssen Sie es wie folgt in eine Instanz kopieren, die nicht von Realm verwaltet wird.

    fun find(): AuthEntity? {
        var result: AuthEntity? = null
        Realm.getDefaultInstance().use { realm ->
            val entity = realm.where(AuthEntity::class.java).findFirst()
            if (entity != null) {
                result = realm.copyFromRealm(entity)
            }
        }
        return result
    }

Realm ist im Allgemeinen so konfiguriert, dass es mit "onCreate ()" instanziiert und mit "onDestroy ()" (Official Document geschlossen wird. docs / java / latest /) scheint auch mit onDestory () geschlossen zu sein.

Sie möchten jedoch nicht, dass die Aktivität vom Dao-Element abhängt, und Sie möchten nicht, dass das ViewModel beispielsweise in MVVM von Realm abhängt. Ich denke also, ich werde eine Klasse erstellen, die Realm umschließt und implementiert, um die Abhängigkeit zu beseitigen. Es ist jedoch übertrieben, Transaktionen zu kennen, ohne von Realm abhängig zu sein, selbst bei einfacher Akquisitionsverarbeitung.

Daher denke ich, dass es eine Entscheidung / Lösung gibt, den obigen Code zu schreiben. Dieser Prozess scheint jedoch in Bezug auf Speicher und Verarbeitungszeit kostspielig zu sein.

Entität benötigt öffentlichen Standardkonstruktor

Bei Verwendung mit Kotlin müssen Sie aufgrund dieser Einschränkung einen Standardwert in das Argument einfügen. Wenn Sie das kotlin-noarg-Plugin verwenden, wird der Standardkonstruktor automatisch generiert. Im Fall von Realm konnte er jedoch nicht erstellt werden, da er in der Vorüberprüfung abgespielt wurde. Entsprechender Quellteil ist.

Selbst wenn Sie die Standardwerte nicht benötigen, würden Sie eine Klasse wie diese schreiben.

@RealmClass
data class SampleEntity(
        @PrimaryKey
        @SerializedName("id")
        var id: Int = 0,

        @SerializedName("sample")
        var sample: String = ""
) : RealmModel 

Recommended Posts

3 schwierige Punkte für Java Realm
Mit Java8 LocalDateTime und Java6 Date ist es schwierig, Mindestwerte zu verarbeiten
[Java] Mit Arrays.asList () zu beachtende Punkte
[java] Zusammenfassung des Umgangs mit char
[Java] Map # Merge ist schwer zu verstehen.
Schreiben Sie Code, der schwer zu testen ist
[java] Zusammenfassung des Umgangs mit Zeichenketten
Zu überprüfende Punkte, wenn Rubocop nur langsam ausgeführt wird
Was ist java
Was ist Java <>?
Was ist java
[Java] Einführung in Java
Einführung in Java
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Was ist Java-Kapselung?
Kotlins Verbesserungen an Java
Was ist Java-Technologie?
Informationen zu Java-Einstiegspunkten
Was ist Java API-Java?
Einführung in den Java-Befehl
[Java] Was ist flatMap?
[Java] Was ist ArrayList?
Für Sie, die von unerwarteten Dezimalstellen in Java betroffen sind
So behandeln Sie Ausnahmen mit Java 8 Stream oder Optional kühl
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
Road to Java Engineer Part2 Was für eine Sprache ist Java?
[Java] Verwenden Sie ResolverStyle.LENIENT, um Datum und Uhrzeit gut zu handhaben
[Java] Code, der schwer zu bemerken, aber furchtbar langsam ist
[Java] UTF-8 (mit Stückliste) wird in 0xFFFD (REPLACEMENT CHARACTER) konvertiert.