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

时间:2015-12-01 05:18:33

标签: java android realm

我试着深入了解这个领域,我在我们的项目中使用它最后几天并且不能理解我的一些奇怪的行为,在我找不到的文档中有用的信息,我看了他们的示例应用程序,但仍然没有足够的信息,所以任何人都可以解释我。为什么Realm返回的模型是空的,在浏览器中显示正确的数据,但不是在调试模式下。realm debug

根据示例"简介示例",这里是片段:

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();
}
我整天都在度过。接下来是我的主要问题,我在一个带有适配器的片段中有一个活动A(让我们说有兔子模型并显示他的4个胡萝卜),点击" +"在片段上我用一个新片段替换我创建3个胡萝卜,然后在popBackStack()之后我不会将这3个胡萝卜添加到之前的4个。

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

1 个答案:

答案 0 :(得分:4)

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

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