Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在领域中存储一长串对象的最有效方法是什么?_Android_Realm_Snappydb - Fatal编程技术网

Android 在领域中存储一长串对象的最有效方法是什么?

Android 在领域中存储一长串对象的最有效方法是什么?,android,realm,snappydb,Android,Realm,Snappydb,我试图将领域与Snappydb进行比较(对于那些想了解基准测试的人)。我猜我的方法是错误的,因为与Sanppydb相比,存储到数据库的时间在领域中花费了超长的时间 基准测试显示了以下结果。如图所示,Realm的速度大约是Snappydb的100-200倍。 我要做的是先创建10000个对象,然后将它们存储到数据库中。因此,在我的代码中,我以这种方式存储Booking对象(有一个for循环,它迭代10000次): 更新 这是用于存储预订对象的Snappydb方法 public void stor

我试图将领域Snappydb进行比较(对于那些想了解基准测试的人)。我猜我的方法是错误的,因为与Sanppydb相比,存储到数据库的时间在领域中花费了超长的时间

基准测试显示了以下结果。如图所示,Realm的速度大约是Snappydb的100-200倍。

我要做的是先创建10000个对象,然后将它们存储到数据库中。因此,在我的代码中,我以这种方式存储Booking对象(有一个for循环,它迭代10000次):

更新 这是用于存储预订对象的Snappydb方法

public void storeBooking(final String key, final Booking booking) {
        try {
            mSnappyDb.put(key, booking);
        } catch (SnappydbException e) {
            e.printStackTrace();
        }
    }
更新 使用
insertOrUpdate()
方法和一个事务的新结果


您的原始解决方案在10000个事务中保存10000个对象,并为其创建10000个对象,因此这几乎是最糟糕的方法


从技术上讲,正确的方法应该是:

public void storeBookings(final List<Booking> bookings) {
    mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.insertOrUpdate(bookings);
        }
    });
}
public void商店预订(最终列表预订){
mRealm.executeTransaction(新领域.Transaction(){
@凌驾
公共void执行(领域){
realm.insertOrUpdate(预订);
}
});
}

在大多数情况下,当保存的对象与原始对象不同时,我所做的是:

public void storeBookings(final List<Booking> bookings) {
    mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmBook realmBook = new RealmBook();
            for(Booking booking : bookings) {
                realmBook = mapper.toRealm(booking, realmBook); // does not create new instance
                realm.insertOrUpdate(realmBook);
            }
        }
    });
}
public void商店预订(最终列表预订){
mRealm.executeTransaction(新领域.Transaction(){
@凌驾
公共void执行(领域){
RealmBook RealmBook=新的RealmBook();
用于(预订:预订){
realmBook=mapper.toRealm(booking,realmBook);//不创建新实例
realm.insertOrUpdate(realmBook);
}
}
});
}

此解决方案使用1个分离的对象来映射列表的内容。

您能分享您正在与之比较的SnappyDB代码吗?@bdash我刚刚更新了我的问题。请看一看。谢谢。据我所知,使用关于领域的实现,您必须创建一个领域实例,这需要时间和内存(这里我们必须创建10.000次)。因此,在我看来,您应该首先尝试运行一个循环来创建10000个预订,然后在一个事务中只使用一个领域实例来存储它们。显示for循环。回答这个问题很重要。但从技术上讲,你在10000个事务中保存了10000个对象,并为此创建了10000个对象,所以这几乎是最糟糕的方法,lolCool,我不知道
insertOrUpdate()
方法。我试图遵循他们在示例代码中显示的方式。我知道有问题,但你帮我找到了更好的方法。谢谢。别忘了指定新的基准测试结果,我很好奇:PI更新了我的问题。有一个指向我的回购的链接;)大约1.5-2.0秒,听起来不错:)但很高兴看到使用多个事务与仅使用一个事务之间的显著差异。这表明人们应该小心他们在做什么。@EpicPandaForce这里什么是mapper?我不认识它。
public void storeBookings(final List<Booking> bookings) {
    mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmBook realmBook = new RealmBook();
            for(Booking booking : bookings) {
                realmBook = mapper.toRealm(booking, realmBook); // does not create new instance
                realm.insertOrUpdate(realmBook);
            }
        }
    });
}