我尝试使用ActiveAndroid将本地数据库与远程数据同步。我将实体User
中存储的本地数据替换为从JSON检索到的新数据。
这是我的用户类
这是完整的实体
@Table(name = "User")
public class User extends Model {
@Column(name = "user_id", unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
public int user_id;
@SerializedName("username")
@Column(name = "username")
public String username;
@SerializedName("name")
@Column(name = "name")
public String name;
@SerializedName("address")
@Column(name = "address")
public String address;
@SerializedName("bio")
@Column(name = "bio")
public String bio;
@SerializedName("gender")
@Column(name = "gender")
public String gender;
@SerializedName("avatar")
@Column(name = "avatar")
public String avatar;
}
这是从API
返回的JSON结果{
user: {
username: "ahmeds",
name: "ahmed shalih",
address: "California",
bio: "IOS Developer",
gender: "M",
avatar: "http://myserverapi/avatar/2728/mdvhnzcyyzmtmd.jpeg",
id: 2728,
}
}
我尝试使用Gson解析上面的json并将其保存到数据库中。但实际上这个用户数据已经存储在本地数据库中。所以,我只是想让它更新。
try{
JSONObject json = new JSONObject(returnedJSON);
JSONObject jsonUser = json.optJSONObject("user");
Gson gson = new Gson();
User updatedUser = gson.from(jsonUser.toString(), User.class);
updatedUser.save(); //add or update the local data
}catch(JSONException ex){
ex.printStackTrace();
}
问题是当我试图保存它时,我收到了像这样的错误消息
Error Inserting
android.database.sqlite.SQLiteConstraintException: foreign key constraint failed (code 19)
然后我才明白发生此错误是因为我使用唯一属性定义了user_id
,这意味着它会阻止具有相同user_id
的重复行。
我已经阅读了有关ActiveAndroid中更新机制的文档,并且我已经尝试过这样做了。
User existingUser = new Select().from(User.class).where("user_id = ?", jsonUser.optInt("user_id").executeSingle();
if(existingUser != null){
Gson gson = new Gson();
User updatedUser = gson.from(jsonUser.toString(), User.class);
existingUser.name = updatedUser.name;
existingUser.adress = updatedUser.name;
existingUser.gender = updatedUser.gender;
existingUser.bio = updatedUser.bio.
existingUser.avatar = updatedUser.avatar;
//...rest of code
// Oh,.. I've to update it all
existingUser.save(); //update
}else{
//insert new
Gson gson = new Gson();
User updatedUser = gson.from(jsonUser.toString(), User.class);
updatedUser.save();
}
这最后的解决方案实际上是有效的。但是我们可以看到,如果我们在User表中有很多列(属性),那么我们必须单独更新属性以执行同步。
任何使解决方案变得简单的解决方案?