如何理解 Realm 在 android 上的行为?

How to understand Realm's behavior on android?

我尝试深入 Realm,我最近几天在我们的项目中使用它,但对我来说无法理解一些奇怪的行为,在文档中我没有找到任何有用的信息,我查看了他们的示例应用程序,但仍然没有足够的信息,所以任何人都可以解释我。为什么 Realm 返回的模型是空的,在浏览器中它显示正确的数据,但在调试模式下却不正确。

根据样本 "Intro example",这里是片段:

private void basicCRUD(Realm realm) {
    showStatus("Perform basic Create/Read/Update/Delete (CRUD) operations...");

    // All writes must be wrapped in a transaction to facilitate safe multi threading
    realm.beginTransaction();

    // Add a person
    Person person = realm.createObject(Person.class);
    person.setId(1);
    person.setName("Young Person");
    person.setAge(14);

    // When the transaction is committed, all changes a synced to disk.
    realm.commitTransaction();

    // Find the first person (no query conditions) and read a field
    person = realm.where(Person.class).findFirst();
    showStatus(person.getName() + ":" + person.getAge());

    // Update person in a transaction
    realm.beginTransaction();
    person.setName("Senior Person");
    person.setAge(99);
    showStatus(person.getName() + " got older: " + person.getAge());
    realm.commitTransaction();

    // Delete all persons
    realm.beginTransaction();
    realm.allObjects(Person.class).clear();
    realm.commitTransaction();
}

我花了一整天。接下来我的主要问题是,我有一个 activity A 在一个带适配器的片段中(可以说它有兔子模型并显示他的 4 个胡萝卜),在片段上单击“+”后我用一个新片段替换我创建了 3 个胡萝卜,然后在 popBackStack() 之后我不会将这 3 个胡萝卜添加到之前的 4 个中。

我是怎么做的:Activity(有 Rabbit 的实例,它有 4 个胡萝卜,保存在 Realm 中)-->片段 A ( 4个胡萝卜)-->片段B(从Realm中获取实例,胡萝卜为空,为什么?我不会添加3个胡萝卜并保存到 Realm 我的兔子)-->popBackStack-->OnCreateView Framgent A(从 Realm 获取 Rabbit,适配器尝试显示数据但胡萝卜是空的。回家吧)。

Realm 是一个零拷贝数据库。这意味着与 ORM 不同,ORM 在您可以访问之前将所有数据复制到 Java 堆,我们将所有数据存储在本机内存中。您可以将 RealmObjects 视为类型安全的游标对象。这也意味着 IntelliJ 调试器不会显示正确的值,因为它显示 Java 堆中的值。我们使用代理 类 来覆盖您的 getter 和 setter 的行为(在您的屏幕截图中:PersonRealmProxy),这就是为什么使用 getX() 方法将 return 正确的值。

关于第二个问题,那么在 GitHub 上创建问题会更容易,因此我们可以询问更多详细信息:https://github.com/realm/realm-java/issues