gpt4 book ai didi

java - Android Realm Arraylist 和简单的 POJO

转载 作者:行者123 更新时间:2023-11-29 19:14:24 25 4
gpt4 key购买 nike

伙计们,我从外部数据库(使用改造)检索了许多(6600 行)对象,这些对象看起来和我的 POJO 类一起工作。之后,我尝试将它放入 Realm 对象中,但速度非常慢。我怀疑这种缓慢的 Action 是因为我开始逐行提交事务。也许有人知道如何在一次提交中将完整的数组列表放入 Realm 对象?我的主要:

private class AsyncTaskRetro extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... voids) {

PlacesAPI.Factory.getInstance().getPlaces().enqueue(new Callback<Places>() {

@Override
public void onResponse(Call<Places> call, Response<Places> response) {
for (int i = 0; i < response.body().getPosts().size(); i++) {
RowModel rowModel = new RowModel(response.body().getPosts().get(i).getNazwa(),
Double.parseDouble(response.body().getPosts().get(i).getSzer()),
Double.parseDouble(response.body().getPosts().get(i).getDlug()));
rowModels.add(rowModel);
}
String oldName;
oldName = rowModels.get(0).getName();
shopsNames.add(rowModels.get(0).getName());


mRealm.beginTransaction();
RowModel rowModelRealm = mRealm.createObject(RowModel.class);
mRealm.commitTransaction();
for (int j = 0; j < rowModels.size(); j++) {
mRealm.beginTransaction();
rowModelRealm.setName(rowModels.get(j).getName());
rowModelRealm.setLattitude(rowModels.get(j).getLattitude());
rowModelRealm.setLongitude(rowModels.get(j).getLongitude());
mRealm.commitTransaction();

if (rowModels.get(j).getName().equals(oldName)) {
continue;
}
oldName = rowModels.get(j).getName();
shopsNames.add(rowModels.get(j).getName());
}



//sortowanie

listy z nazwami sklepow
Collections.sort(shopsNames);

adapter = new ShopsAdapter(MainActivity.this, shopsNames);

recyclerView.setAdapter(adapter);


}

@Override
public void onFailure(Call<Places> call, Throwable t) {

}
});

return null;
}
}

和 POJO:

public class RowModel extends RealmObject {

@Required
private String name;
@Required
private Double lattitude, longitude;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Double getLattitude() {
return lattitude;
}

public void setLattitude(Double lattitude) {
this.lattitude = lattitude;
}

public Double getLongitude() {
return longitude;
}

public void setLongitude(Double longitude) {
this.longitude = longitude;
}

public RowModel(String name, Double lattitude, Double longitude) {
this.name = name;
this.lattitude = lattitude;
this.longitude = longitude;
}

public RowModel() {
}
}

最佳答案

1.) 你使用的是 Realm 0.82.2,这个版本有一些问题,这就是为什么我推荐的下一个稳定版本是 0.87.5;但实际上最新稳定版本(目前)是 3.1.4。

您可能应该切换到 2 年前的版本?

2.) 您正在运行一个 AsyncTask,但您在其中使用了 enqueue:

getPlaces().enqueue(new Callback<Places>() {    
@Override
public void onResponse(Call<Places> call, Response<Places> response) {

这意味着 Retrofit 回调将在 UI 线程上执行。

然后,您执行同步事务,因此您在 UI 线程上写入 Realm,这很糟糕。

3.) 您正在尝试手动对下载的元素进行排序,然后也在适配器中手动显示它们,如果您使用的是 Realm,这没有意义,因为 Realm 允许按特定字段对元素进行排序。此外,shopsNames 绝对不是 RealmResults,这意味着您甚至不会监听对数据库所做的更改。

ShopsAdapter 应该是一个 RealmBaseAdapter


所以代码应该更像这样

private class AsyncTaskRetro
extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... voids) {
try(Realm r = Realm.getDefaultInstance()) {
Response<Place> response = PlacesAPI.Factory.getInstance().getPlaces().execute();
Place place = response.body();
List<Post> posts = place.getPosts();
r.executeTransaction((realm) -> {
for(Post post : posts) {
RowModel rowModel = new RowModel(post.getNazwa(),
Double.parseDouble(post.getSzer()),
Double.parseDouble(post.getDlug()));
rowModels.add(rowModel);
}
String oldName;
oldName = rowModels.get(0).getName();
shopsNames.add(rowModels.get(0).getName());

RowModel rowModelRealm = realm.createObject(RowModel.class);
for(RowModel rowModel : rowModels) {
rowModelRealm.setName(rowModel.getName());
rowModelRealm.setLattitude(rowModel.getLattitude());
rowModelRealm.setLongitude(rowModel.getLongitude());

if(rowModel.getName().equals(oldName)) {
continue;
}
oldName = rowModel.getName();
shopsNames.add(rowModel.getName());
}
});
// no need to manually sort if you use RealmBaseAdapter with findAllSorted()
}
return null;
}
}

关于java - Android Realm Arraylist 和简单的 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44121630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com