Android 如何在域中正确添加100万项?

Android 如何在域中正确添加100万项?,android,realm,Android,Realm,我想在原生SQLiteDatabase和Realm之间进行选择,以处理大量数据 对于基准测试,我向存储中添加了100万个产品实体: {id:integer,sku:string,name:string,data\u creating:string} 使用SQLiteDatabase在我的设备上需要近1分钟34秒 使用Realm需要10分钟以上的时间 我的代码是: Realm realm = Realm.getInstance(getApplicationContext()); realm.beg

我想在原生
SQLiteDatabase
Realm
之间进行选择,以处理大量数据

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

{id:integer,sku:string,name:string,data\u creating:string}

使用
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();
Realm-Realm=Realm.getInstance(getApplicationContext());
realm.beginTransaction();
对于(int i=0;i<1000000;i++){
Product=realm.createObject(Product.class);
产品设置ID(i+1);
product.setName(“product_u”+i);
product.setSku(“SKU__;”+i);
product.setDateCreated(新日期());
}
realm.commitTransaction();

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

您必须意识到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();
long numberOfObjects=1000000;
SharedGroup SharedGroup=新的SharedGroup(“default.realm”);
WriteTransaction WriteTransaction=sharedGroup.beginWrite();
Table=writeTransaction.getTable(“class_产品”);
表.附录(numberOfObjects);
for(int i=0;i
现在可以比较两个面向表/行的数据存储,您可能会发现Realm比SQLite快一点


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

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

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);
            }
        }
    });
}
最终产品=新产品();
最终日期=新日期();
try(Realm-Realm=Realm.getDefaultInstance()){
realm.executeTransaction(新realm.Transaction(){
@凌驾
公共void执行(领域){
对于(int i=0;i<1000000;i++){
产品设置ID(i+1);
product.setName(“product_u”+i);
product.setSku(“SKU__;”+i);
product.setDateCreated(日期);
领域.插入(产品);
}
}
});
}

1:34分钟
?1小时34分钟?@greenapps 1分钟34秒您的问题很可能是使用
createObject
创建1000000个对象,因为它使GC陷入混乱。这个东西到底消耗了多少内存:D它在堆上为每个产品i工作believe@JemshitIskenderovyeapI已经添加了一个问题,以提供更好的性能,而不是使用未记录的API:哇,速度快了3倍。但需要对上面的代码进行一些更改才能正常工作。请参考下面的新答案,在循环中插入项(如此答案所示)或映射所有对象并通过一个InsertRorUpdate()插入它们,更好的方法是什么?