使用ActiveAndroid将本地数据库与远程数据库同步

时间:2015-11-27 07:23:29

标签: android database synchronization activeandroid

我尝试使用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();
}

这最后的解决方案实际上是有效的。但是我们可以看到,如果我们在U​​ser表中有很多列(属性),那么我们必须单独更新属性以执行同步。

任何使解决方案变得简单的解决方案?

0 个答案:

没有答案