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

时间:2015-03-23 15:34:19

标签: android realm

我想在原生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();

如何改进代码以获得更好的时间效果?

2 个答案:

答案 0 :(得分:10)

最初的问题在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);
            }
        }
    });
}

答案 1 :(得分:9)

你必须意识到SQLite和Realm是两个非常不同的东西。 Realm是一个对象存储,您在上面显示的代码中创建了很多对象。根据您的模型类和行/对象的数量,您经常会看到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();

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

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