首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在领域中存储对象长列表的最有效方法是什么?

在领域中存储对象长列表的最有效方法是什么?
EN

Stack Overflow用户
提问于 2016-09-08 03:14:01
回答 1查看 3.1K关注 0票数 12

我正在尝试将领域Snappydb (希望查看基准测试的人的这是我的回购)进行比较。我想我的方法是错误的,因为与Sanppydb相比,存储到数据库的时间在领域中花费了非常长的时间。

基准测试显示以下结果。正如您在图像中所看到的,领域比Snappydb慢100到200倍。

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

代码语言:javascript
复制
public void storeBooking(final Booking booking) {
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                Booking realmBooking = realm.createObject(Booking.class);
                realmBooking.setId(booking.getId());
                realmBooking.setCode(booking.getCode());
                realmBooking.setFareLowerBound(booking.getFareLowerBound());
                realmBooking.setFareUpperBound(booking.getFareUpperBound());
                realmBooking.setPhoneNumber(booking.getPhoneNumber());
                realmBooking.setPickUpTime(booking.getPickUpTime());
                realmBooking.setRequestedTaxiTypeName(booking.getRequestedTaxiTypeName());
                realmBooking.setTaxiTypeId(booking.getTaxiTypeId());
            }
        });
    }

更新

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

代码语言:javascript
复制
public void storeBooking(final String key, final Booking booking) {
        try {
            mSnappyDb.put(key, booking);
        } catch (SnappydbException e) {
            e.printStackTrace();
        }
    }

更新

使用insertOrUpdate()方法和一个事务的新结果

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-08 08:23:10

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

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

代码语言:javascript
复制
public void storeBookings(final List<Booking> bookings) {
    mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.insertOrUpdate(bookings);
        }
    });
}

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

代码语言:javascript
复制
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);
            }
        }
    });
}

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39382021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档