【发布时间】:2018-07-12 09:54:25
【问题描述】:
我想从数据库中获取对象列表,并在网络请求后更新数据库中的这些对象。
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 的描述创建主键吗?
【问题讨论】:
-
也许我完全误解了您的命名约定,但
trip_id听起来像是主键? -
@EpicPandaForce 没有。是旅行的id。旅行由很多 TripTracks 组成。我添加了 TripTrack 类。
-
你需要一个主键,一个好的解决方案是使用
UUID.randomUUID().toString()来获取一个唯一的id。即使您不使用它,因为您使用其他标准来查找您的日期
标签: android realm realm-java