Android ormlite обновление строк в сериализованном объекте - PullRequest
2 голосов
/ 16 марта 2012

У меня есть 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 ]

1 голос
/ 04 мая 2012

Как я понимаю ответ Итана, это означало бы загрузку объекта 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;).- в любом случае этот запрос на обновление может удовлетворить ваши потребности, в зависимости от сложности вашего обновления.Большой плюс: нет необходимости загружать объект в память.

1 голос
/ 16 марта 2012

Я бы заставил имя столбца быть статичным, чтобы вы могли искать по нему.Примерно так:

@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

Надеюсь, это поможет!

...