网络请求后更新Realm DB中的对象列表

时间:2018-07-12 09:54:26

标签: 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 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);

发送:

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);
                        }
                    });
                }
            }
        }
    }
// . . .

对于copyToRealmOrUpdate,我需要@PrimaryKey。但是Realm不支持PrimaryKey的自动增量。 没有主键,是否可以执行上述操作?我是否应该按照here所述创建主键?

1 个答案:

答案 0 :(得分:0)

*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()
        }
    }
}