如何在 Realm 中正确添加 100 万个项目?

How to add 1 milion items in Realm correctly?

我想在原生 SQLiteDatabaseRealm 之间进行选择以处理大量数据。

为了进行基准测试,我向存储中添加了 100 万个产品实体:

{id:整数,sku:字符串,名称:字符串,data_creating:字符串}

在我的设备上使用 SQLiteDatabase 需要将近 1 分 34 秒。

使用 Realm 需要多花 10 分钟。

我的代码是:

Realm realm = Realm.getInstance(getApplicationContext());
realm.beginTransaction();
for(int i = 0 ; i < 1000000;i++){
    Product product = realm.createObject(Product.class);
    product.setId(i+1);
    product.setName("Product_"+i);
    product.setSku("SKU__"+i);
    product.setDateCreated(new Date());
}
realm.commitTransaction();

如何改进我的代码以获得更好的时间性能?

你必须意识到 SQLite 和 Realm 是两个截然不同的东西。 Realm 是一个对象存储,您在上面显示的代码中创建了很多对象。根据您的模型 class 和 rows/objects 的数量,您经常会发现 Realm 在插入时有点慢。为了公平比较,您可以将 Realm 与众多优秀的 ORM 之一进行比较。

据说,Realm 提供了一个低级接口 (io.realm.internal)。我不建议您使用它,因为它目前没有记录。您的示例如下所示:

long numberOfObjects = 1000000;
SharedGroup sharedGroup = new SharedGroup("default.realm");            
WriteTransaction writeTransaction = sharedGroup.beginWrite();
Table table = writeTransaction.getTable("class_Product");
table.addEmptyRows(numberOfObjects);
for (int i = 0; i < numberOfObjects; i++) {
    table.setLong(0, i, i);              // id
    table.setString(1, i, "Product_"+i); // name
    table.setString(2, i, "SKU__"+i);    // sku
    table.SetDate(3, i, new Date());     // date
}
writeTransaction.commit();
sharedGroup.close();

您现在可以比较两个面向 table/row 的数据存储,您可能会发现 Realm 比 SQLite 快一点。

在 Realm,我们有一些关于如何让我们的对象接口更快 运行 的想法,我们希望能够在不久的将来实现它们。

最初的问题在 Realm 中引起了讨论,我们最终为 insert 对象添加了一个更快的方法。创建和插入 1 个 mio 对象的代码现在可以写成:

final Product product = new Product();
final Date date = new Date();
try(Realm realm = Realm.getDefaultInstance()) {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            for(int i = 0 ; i < 1000000; i++){
                product.setId(i+1);
                product.setName("Product_"+i);
                product.setSku("SKU__"+i);
                product.setDateCreated(date);
                realm.insert(product);
            }
        }
    });
}