在 Realm 中存储一长串对象的最有效方法是什么?
What is the most efficient way to store long list of Objects in Realm?
我正在尝试将 Realm 与 Snappydb 进行比较(This is my repo 对于那些想看看的人基准)。我想我的方法是错误的,因为与 Sanppydb 相比,存储到数据库的时间在 Realm 中花费了超长的时间。
基准测试显示以下结果。如图所示,Realm 比 Snappydb 慢 100-200 倍左右。
我所做的是先创建 10,000 个对象,然后将它们存储到数据库中。因此,在我的代码中,我以这种方式存储一个 Booking 对象(有一个迭代 10,000 次的 for 循环):
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());
}
});
}
更新
这是存储Booking对象的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 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 个分离对象来映射列表的内容。
我正在尝试将 Realm 与 Snappydb 进行比较(This is my repo 对于那些想看看的人基准)。我想我的方法是错误的,因为与 Sanppydb 相比,存储到数据库的时间在 Realm 中花费了超长的时间。
基准测试显示以下结果。如图所示,Realm 比 Snappydb 慢 100-200 倍左右。
我所做的是先创建 10,000 个对象,然后将它们存储到数据库中。因此,在我的代码中,我以这种方式存储一个 Booking 对象(有一个迭代 10,000 次的 for 循环):
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());
}
});
}
更新
这是存储Booking对象的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 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 个分离对象来映射列表的内容。