Android 网络请求后更新领域数据库中的对象列表

Android 网络请求后更新领域数据库中的对象列表,android,realm,realm-java,Android,Realm,Realm Java,我想从数据库中获取对象列表,并在网络请求后在数据库中更新这些对象 public class TripTrack extends RealmObject { private int tripId; private double latitude; private double longitude; private long downtime; private long timestamp; private boolean sent;

我想从数据库中获取对象列表,并在网络请求后在数据库中更新这些对象

public class TripTrack extends RealmObject {
    private int tripId;

    private double latitude;

    private double longitude;

    private long downtime;

    private long timestamp;

    private boolean sent;

    public int getTripId() {
        return tripId;
    }

    public void setTripId(int tripId) {
        this.tripId = tripId;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

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

    public long getDowntime() {
        return downtime;
    }

    public void setDowntime(long downtime) {
        this.downtime = downtime;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public boolean isSent() {
        return sent;
    }

    public void setSent(boolean sent) {
        this.sent = sent;
    }
}
从数据库获取:

List<TripTrack> localTrack = new ArrayList<>();

try (Realm realmInstance = Realm.getDefaultInstance()) {
    realmInstance.executeTransaction((realm) -> {
        List<TripTrack> trackFromDB = realm.where(TripTrack.class).equalTo("sent", false).findAll();

        localTrack.addAll(realm.copyFromRealm(trackFromDB));
    });
}

updateTrack(localTrack);
List localTrack=new ArrayList();
try(realmrealminstance=Realm.getDefaultInstance()){
realmInstance.executeTransaction((领域)->{
List trackFromDB=realm.where(TripTrack.class).equalTo(“sent”,false).findAll();
localTrack.addAll(realm.copyFromRealm(trackFromDB));
});
}
updateTrack(本地跟踪);
发送:

private void updateTrack(List<TripTrack> localTrack) {
    JSONObject params = new JSONObject();
    try {
        JSONArray locations = new JSONArray();
        for(TripTrack tripTrack : localTrack) {
            JSONObject loc = new JSONObject();

            loc.put("trip_id", String.valueOf(tripTrack.getTripId()));
            loc.put("latitude", String.valueOf(tripTrack.getLatitude()));
            loc.put("longitude", String.valueOf(tripTrack.getLongitude()));
            loc.put("downtime", String.valueOf(tripTrack.getDowntime()));
            loc.put("timestamp", String.valueOf(tripTrack.getTimestamp()));

            locations.put(loc);
        }

        params.put("locations", locations);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    UpdateTripTrackRequest updateTripTrackRequest = new UpdateTripTrackRequest<>(this, params, DefaultResponse.class,  new Response.Listener<DefaultResponse>() {
        @Override
        public void onResponse(DefaultResponse response) {
            if(response.getCode() == 0) {
                try (Realm realmInstance = Realm.getDefaultInstance()) {
                    realmInstance.executeTransaction((realm) -> {
                        for(TripTrack tripTrack : localTrack) {
                            tripTrack.setSent(true);
                            realm.copyToRealmOrUpdate(tripTrack);
                        }
                    });
                }
            }
        }
    }
// . . .
private void updateTrack(列出localTrack){
JSONObject参数=新的JSONObject();
试一试{
JSONArray locations=新的JSONArray();
用于(TripTrack TripTrack:localTrack){
JSONObject loc=新的JSONObject();
loc.put(“trip_id”,String.valueOf(tripTrack.getTripId());
loc.put(“latitude”,String.valueOf(tripTrack.getLatitude());
loc.put(“经度”,String.valueOf(tripTrack.getLongitude());
loc.put(“停机”,String.valueOf(tripTrack.getDowntime());
loc.put(“timestamp”,String.valueOf(tripTrack.getTimestamp());
位置。放置位置(loc);
}
参数put(“位置”,位置);
}捕获(JSONException e){
e、 printStackTrace();
}
UpdateRetrickRequest UpdateRetrickRequest=new UpdateRetrickRequest(this,params,DefaultResponse.class,new Response.Listener(){
@凌驾
public void onResponse(DefaultResponse){
if(response.getCode()==0){
try(realmrealminstance=Realm.getDefaultInstance()){
realmInstance.executeTransaction((领域)->{
用于(TripTrack TripTrack:localTrack){
tripTrack.setSent(真);
realm.copyToRealmOrUpdate(tripTrack);
}
});
}
}
}
}
// . . .
对于
copyToRealmOrUpdate
我需要
@PrimaryKey
。但是Realm不支持PrimaryKey的自动递增。 是否可以在没有主键的情况下执行上述操作?我是否应该按所述创建主键?

*此处invoice是域对象和invoiceList,具有更新的invoice。
suspend-fun-updateList(invoiceList:MutableList,mRealm:Realm){
withContext(Dispatchers.Main){
试一试{
mRealm.executeTransaction{
it.insertOrUpdate(发票列表)
}
}捕获(错误:异常){
错误。printStackTrace()
}最后{
mRealm.close()
}
}
}

也许我完全误解了您的命名约定,但是
trip\u id
听起来像主键?@EpicPandaForce no.它是trip的id。trip由很多TripTrack组成。我添加了TripTrack类。您需要一个主键,一个好的解决方案是使用
UUID.randomUUID().toString()
获取唯一的id。即使您不使用它,因为您使用其他标准来查找您的日期
*Here invoice is realm object and invoiceList with an updated invoice.

suspend fun updateList(invoiceList: MutableList<Invoice>, mRealm: Realm) {
    withContext(Dispatchers.Main) {
        try {
            mRealm.executeTransaction {
                it.insertOrUpdate(invoiceList)
            }
        } catch (error: Exception) {
            error.printStackTrace()
        } finally {
            mRealm.close()
        }
    }
}