Android ormlite更新Serialized Object中的行

时间:2012-03-16 16:44:16

标签: android ormlite

我有3张桌子:

@DatabaseTable(tableName="user")
public class TableUser  implements Serializable{

  @DatabaseField(dataType = DataType.SERIALIZABLE)
    private LinkedList<TableProfile> profiles;
}

@DatabaseTable(tableName="profile")
public class TableProfile implements Serializable{

   @DatabaseField(dataType = DataType.SERIALIZABLE)
    private LinkedList<TableRevel> revelations;
}

@DatabaseTable(tableName="revel")
public class TableRevel implements Serializable{
    private String our_profile_id;
    @DatabaseField(canBeNull=false)
    private String other_profile_id;
    @DatabaseField(canBeNull=false)
    private String info;
    @DatabaseField(canBeNull=false)
}

我需要在“revel”表中更新文件,我得到Json的启示,没有对象“user:{profile:...}”

我认为我需要使用QueryBuilder,如果它是可行的,请写下此查询的简短示例。

2 个答案:

答案 0 :(得分:1)

我会强制列名称是静态的,因此您可以搜索它。像这样:

@DatabaseTable(tableName="revel")
public class TableRevel implements Serializable{
  public static final String PROFILE_ID = 'id';
  @DatabaseField(canBeNull=false, columnName = PROFILE_ID)
  private String our_profile_id;
  @DatabaseField(canBeNull=false)
  private String other_profile_id;
  @DatabaseField(canBeNull=false)
  private String info;
}

然后我会做这样的事情来进行更新:

public class foo extends OrmLiteSqliteOpenHelper {
...

public updateField(String jsonString) throws SQLException{
  Dao<TableRevel, String> revelDAO = getDao(TableRevel.class);
  QueryBuilder<TableRevel, String> queryBuilder = revelDAO.queryBuilder();
  queryBuilder.where().eq(TableRevel.PROFILE_ID, getIdFromJson(jsonString) );
  PreparedQuery<TableRevel> preparedQuery = queryBuilder.prepare();
  TableRevel revelEntry = revelDAO.queryForFirst();

  //update the entry here
  ...

  revelDAO.update(revelEntry); //update the data

我编写了一个使用OrmLite的项目。执行很多sql工作的类的链接在这里:https://github.com/kopysoft/Chronos/blob/development/ChronosApp/src/com/kopysoft/chronos/content/Chronos.java

希望这有帮助!

答案 1 :(得分:1)

据我了解Ethan的回答,这意味着将TableRevel对象加载到内存中以便更新它。根据您需要的更新类型,这可能是一个可行的替代方案:

public update(String jsonString) throws SQLException{

  Dao<TableRevel, String> dao= getDao(TableRevel.class);
  UpdateBuilder<TableRevel, String> updateBuilder = dao.updateBuilder();
  //Update the columns you want to update for the given jsonString-match
  updateBuilder.updateColumnValue(TableRevel.My_FIELD, newValue);
  // ...where the json string matches
  updateBuilder.where().eq(TableRevel.PROFILE_ID, getIdFromJson(jsonString));
  //Execute the update
  dao.update(updateBuilder.prepare());

}

很抱歉,如果我误解了你的问题,但你提供的信息有点稀疏,我曾经不知道json的内部;)。 - 这种更新查询的方式可能适合您的需求,具体取决于您的udpate的复杂程度。大加:无需将对象加载到内存中。