我尝试更深入地了解 Realm,我最近几天在我们的项目中使用它,并且无法理解一些奇怪的行为,对于我来说,在文档中我没有找到任何有用的信息,我查看了他们的示例应用程序,但仍然没有足够的信息,所以任何人都可以解释我。为什么 Realm 返回的模型是空的,在浏览器中它显示正确的数据,但在 Debug模式下不显示。
根据示例“介绍示例”,以下是代码 fragment :
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();
}
我花了一整天的时间。接下来我的主要问题是,我在带有适配器的一个 fragment 中有一个 Activity A(假设有兔子的模型并显示他的 4 个胡萝卜),在 fragment 上单击“+”后,我用一个新 fragment 替换,在其中创建了 3 个胡萝卜,然后在 popBackStack() 之后我不会将这 3 个胡萝卜添加到之前的 4 个胡萝卜中。
我是如何做到的: Activity (有兔子实例,有 4 个胡萝卜,保存在 Realm 中)--> fragment A(4 个胡萝卜)-->< strong> fragment B(从Realm获取实例,胡萝卜是空的,为什么?我不会添加3个胡萝卜并保存到Realm我的兔子)-->popBackStack -->OnCreateView Framgent A(从 Realm 获取 Rabbit,适配器尝试显示数据,但胡萝卜是空的。回家)。
最佳答案
Realm 是一个零拷贝数据库。这意味着,与 ORM 在访问之前将所有数据复制到 Java 堆不同,我们将所有数据存储在 native 内存中。您可以将 RealmObjects 视为类型安全的游标对象。这也意味着 IntelliJ 调试器不会显示正确的值,因为它显示的是 Java 堆中的值。我们使用代理类来覆盖 getter 和 setter 的行为(在屏幕截图中:PersonRealmProxy),这就是为什么使用 getX()
方法将返回正确的值。
关于第二个问题,在 GitHub 上创建问题会更容易,这样我们就可以询问更多详细信息:https://github.com/realm/realm-java/issues
关于java - 如何理解 Realm 在 android 上的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34013129/