agrosner / DBFlow

A blazing fast, powerful, and very simple ORM android database library that writes database code for you.
MIT License
4.87k stars 598 forks source link

Generate code error by using @OneToMany(methods = {OneToMany.Method.ALL}) on 4.0.1 #1285

Closed wind0ws closed 7 years ago

wind0ws commented 7 years ago

DBFlow Version: 4.0.1 Issue Kind:Bug

Description: When i using 4.0.0-beta7 , It is ok to compile.But change to 4.0.1, it won't work,the generate code says it can't find "adapter" field in insert/save/update/delete method.

Here is my database model.

   public ExpStatus() { }

    @PrimaryKey
    @Column
    private String expUID; 
    @NotNull
    @Column
    private String expNumber;
    @NotNull
    @Column
    private String expSpellName;
    @Column
    private boolean isCheck;
    @Column
    private int state;
    @Column
    private String expTextName;

    private List<ExpStatusData> data;

    @OneToMany(methods = {OneToMany.Method.ALL},
            variableName = "data",isVariablePrivate = true)
    public List<ExpStatusData> getData() {
        if (data == null /*|| data.isEmpty()*/) {
            data = SQLite.select()
                    .from(ExpStatusData.class)
                    .where(ExpStatusData_Table.expUID.eq(expUID))
                    .orderBy(ExpStatusData_Table.time,false)
                    .queryList();
        }
        return data;
    }

Here is generate code which using DbFlow 4.0.1

/**
 * This is generated code. Please do not modify */
public final class ExpStatus_Table extends ModelAdapter<ExpStatus> {
  /**
   * Primary Key */
  public static final Property<String> expUID = new Property<String>(ExpStatus.class, "expUID");

  public static final Property<String> expNumber = new Property<String>(ExpStatus.class, "expNumber");

  public static final Property<String> expSpellName = new Property<String>(ExpStatus.class, "expSpellName");

  public static final Property<Boolean> isCheck = new Property<Boolean>(ExpStatus.class, "isCheck");

  public static final Property<Integer> state = new Property<Integer>(ExpStatus.class, "state");

  public static final Property<String> expTextName = new Property<String>(ExpStatus.class, "expTextName");

  public static final IProperty[] ALL_COLUMN_PROPERTIES = new IProperty[]{expUID,expNumber,expSpellName,isCheck,state,expTextName};

  public ExpStatus_Table(DatabaseDefinition databaseDefinition) {
    super(databaseDefinition);
  }

  @Override
  public final Class<ExpStatus> getModelClass() {
    return ExpStatus.class;
  }

  @Override
  public final String getTableName() {
    return "`ExpStatus`";
  }

  @Override
  public final ExpStatus newInstance() {
    return new ExpStatus();
  }

  @Override
  public final ConflictAction getUpdateOnConflictAction() {
    return ConflictAction.ROLLBACK;
  }

  @Override
  public final ConflictAction getInsertOnConflictAction() {
    return ConflictAction.ROLLBACK;
  }

  @Override
  public final Property getProperty(String columnName) {
    columnName = QueryBuilder.quoteIfNeeded(columnName);
    switch ((columnName)) {
      case "`expUID`":  {
        return expUID;
      }
      case "`expNumber`":  {
        return expNumber;
      }
      case "`expSpellName`":  {
        return expSpellName;
      }
      case "`isCheck`":  {
        return isCheck;
      }
      case "`state`":  {
        return state;
      }
      case "`expTextName`":  {
        return expTextName;
      }
      default: {
        throw new IllegalArgumentException("Invalid column name passed. Ensure you are calling the correct table's column");
      }
    }
  }

  @Override
  public final IProperty[] getAllColumnProperties() {
    return ALL_COLUMN_PROPERTIES;
  }

  @Override
  public final void bindToInsertValues(ContentValues values, ExpStatus model) {
    values.put("`expUID`", model.getExpUID() != null ? model.getExpUID() : null);
    values.put("`expNumber`", model.getExpNumber() != null ? model.getExpNumber() : null);
    values.put("`expSpellName`", model.getExpSpellName() != null ? model.getExpSpellName() : null);
    values.put("`isCheck`", model.isCheck() ? 1 : 0);
    values.put("`state`", model.getState());
    values.put("`expTextName`", model.getExpTextName() != null ? model.getExpTextName() : null);
  }

  @Override
  public final void bindToInsertStatement(DatabaseStatement statement, ExpStatus model, int start) {
    statement.bindStringOrNull(1 + start, model.getExpUID());
    statement.bindStringOrNull(2 + start, model.getExpNumber());
    statement.bindStringOrNull(3 + start, model.getExpSpellName());
    statement.bindLong(4 + start, model.isCheck() ? 1 : 0);
    statement.bindLong(5 + start, model.getState());
    statement.bindStringOrNull(6 + start, model.getExpTextName());
  }

  @Override
  public final String getCompiledStatementQuery() {
    return "INSERT OR ROLLBACK INTO `ExpStatus`(`expUID`,`expNumber`,`expSpellName`,`isCheck`,`state`,`expTextName`) VALUES (?,?,?,?,?,?)";
  }

  @Override
  public final String getCreationQuery() {
    return "CREATE TABLE IF NOT EXISTS `ExpStatus`(`expUID` TEXT, `expNumber` TEXT NOT NULL, `expSpellName` TEXT NOT NULL, `isCheck` INTEGER, `state` INTEGER, `expTextName` TEXT, PRIMARY KEY(`expUID`))";
  }

  @Override
  public final void loadFromCursor(FlowCursor cursor, ExpStatus model) {
    model.setExpUID(cursor.getStringOrDefault("expUID"));
    model.setExpNumber(cursor.getStringOrDefault("expNumber"));
    model.setExpSpellName(cursor.getStringOrDefault("expSpellName"));
    int index_isCheck = cursor.getColumnIndex("isCheck");
    if (index_isCheck != -1 && !cursor.isNull(index_isCheck)) {
      model.setCheck(cursor.getBoolean(index_isCheck));
    } else {
      model.setCheck(false);
    }
    model.setState(cursor.getIntOrDefault("state"));
    model.setExpTextName(cursor.getStringOrDefault("expTextName"));
    model.getData();
  }

  @Override
  public final boolean exists(ExpStatus model, DatabaseWrapper wrapper) {
    return SQLite.selectCountOf()
    .from(ExpStatus.class)
    .where(getPrimaryConditionClause(model))
    .hasData(wrapper);
  }

  @Override
  public final OperatorGroup getPrimaryConditionClause(ExpStatus model) {
    OperatorGroup clause = OperatorGroup.clause();
    clause.and(expUID.eq(model.getExpUID()));
    return clause;
  }

  @Override
  public final boolean delete(ExpStatus model) {
    boolean successful = super.delete(model);
    if (model.getData() != null) {
      adapter.deleteAll(model.getData());
    }
    model.setData(null);
    return successful;
  }

  @Override
  public final boolean delete(ExpStatus model, DatabaseWrapper wrapper) {
    boolean successful = super.delete(model, wrapper);
    if (model.getData() != null) {
      adapter.deleteAll(model.getData(), wrapper);
    }
    model.setData(null);
    return successful;
  }

  @Override
  public final boolean save(ExpStatus model) {
    boolean successful = super.save(model);
    if (model.getData() != null) {
      adapter.saveAll(model.getData());
    }
    return successful;
  }

  @Override
  public final long insert(ExpStatus model) {
    long rowId = super.insert(model);
    if (model.getData() != null) {
      adapter.insertAll(model.getData());
    }
    return rowId;
  }

  @Override
  public final boolean update(ExpStatus model) {
    boolean successful = super.update(model);
    if (model.getData() != null) {
      adapter.updateAll(model.getData());
    }
    return successful;
  }

  @Override
  public final boolean save(ExpStatus model, DatabaseWrapper wrapper) {
    boolean successful = super.save(model, wrapper);
    if (model.getData() != null) {
      adapter.saveAll(model.getData(), wrapper);
    }
    return successful;
  }

  @Override
  public final long insert(ExpStatus model, DatabaseWrapper wrapper) {
    long rowId = super.insert(model, wrapper);
    if (model.getData() != null) {
      adapter.insertAll(model.getData(), wrapper);
    }
    return rowId;
  }

  @Override
  public final boolean update(ExpStatus model, DatabaseWrapper wrapper) {
    boolean successful = super.update(model, wrapper);
    if (model.getData() != null) {
      adapter.updateAll(model.getData(), wrapper);
    }
    return successful;
  }
}

As you can see ,in insert/update/delete/save method ,the "adapter" field just appear and don't know come from where.

when i using 4.0.0-beta7,it is ok with generate code: here is generate code by 4.0.0-beta7:

/**
 * This is generated code. Please do not modify */
public final class ExpStatus_Table extends ModelAdapter<ExpStatus> {
  /**
   * Primary Key */
  public static final Property<String> expUID = new Property<String>(ExpStatus.class, "expUID");

  public static final Property<String> expNumber = new Property<String>(ExpStatus.class, "expNumber");

  public static final Property<String> expSpellName = new Property<String>(ExpStatus.class, "expSpellName");

  public static final Property<Boolean> isCheck = new Property<Boolean>(ExpStatus.class, "isCheck");

  public static final Property<Integer> state = new Property<Integer>(ExpStatus.class, "state");

  public static final Property<String> expTextName = new Property<String>(ExpStatus.class, "expTextName");

  public static final IProperty[] ALL_COLUMN_PROPERTIES = new IProperty[]{expUID,expNumber,expSpellName,isCheck,state,expTextName};

  public ExpStatus_Table(DatabaseHolder holder, DatabaseDefinition databaseDefinition) {
    super(databaseDefinition);
  }

  @Override
  public final Class<ExpStatus> getModelClass() {
    return ExpStatus.class;
  }

  public final String getTableName() {
    return "`ExpStatus`";
  }

  @Override
  public final Property getProperty(String columnName) {
    columnName = QueryBuilder.quoteIfNeeded(columnName);
    switch (columnName)  {
      case "`expUID`":  {
        return expUID;
      }
      case "`expNumber`":  {
        return expNumber;
      }
      case "`expSpellName`":  {
        return expSpellName;
      }
      case "`isCheck`":  {
        return isCheck;
      }
      case "`state`":  {
        return state;
      }
      case "`expTextName`":  {
        return expTextName;
      }
      default: {
        throw new IllegalArgumentException("Invalid column name passed. Ensure you are calling the correct table's column");
      }
    }
  }

  public final IProperty[] getAllColumnProperties() {
    return ALL_COLUMN_PROPERTIES;
  }

  @Override
  public final ExpStatus newInstance() {
    return new ExpStatus();
  }

  @Override
  public final ConflictAction getUpdateOnConflictAction() {
    return ConflictAction.ROLLBACK;
  }

  @Override
  public final ConflictAction getInsertOnConflictAction() {
    return ConflictAction.ROLLBACK;
  }

  @Override
  public final void bindToInsertValues(ContentValues values, ExpStatus model) {
    String refexpUID = model.getExpUID();
    values.put("`expUID`", refexpUID != null ? refexpUID : null);
    String refexpNumber = model.getExpNumber();
    values.put("`expNumber`", refexpNumber != null ? refexpNumber : null);
    String refexpSpellName = model.getExpSpellName();
    values.put("`expSpellName`", refexpSpellName != null ? refexpSpellName : null);
    values.put("`isCheck`", model.isCheck() ? 1 : 0);
    values.put("`state`", model.getState());
    String refexpTextName = model.getExpTextName();
    values.put("`expTextName`", refexpTextName != null ? refexpTextName : null);
  }

  @Override
  public final void bindToInsertStatement(DatabaseStatement statement, ExpStatus model, int start) {
    String refexpUID = model.getExpUID();
    if (refexpUID != null)  {
      statement.bindString(1 + start, refexpUID);
    } else {
      statement.bindNull(1 + start);
    }
    String refexpNumber = model.getExpNumber();
    if (refexpNumber != null)  {
      statement.bindString(2 + start, refexpNumber);
    } else {
      statement.bindNull(2 + start);
    }
    String refexpSpellName = model.getExpSpellName();
    if (refexpSpellName != null)  {
      statement.bindString(3 + start, refexpSpellName);
    } else {
      statement.bindNull(3 + start);
    }
    statement.bindLong(4 + start, model.isCheck() ? 1 : 0);
    statement.bindLong(5 + start, model.getState());
    String refexpTextName = model.getExpTextName();
    if (refexpTextName != null)  {
      statement.bindString(6 + start, refexpTextName);
    } else {
      statement.bindNull(6 + start);
    }
  }

  @Override
  public final void bindToStatement(DatabaseStatement statement, ExpStatus model) {
    bindToInsertStatement(statement, model, 0);
  }

  @Override
  public final String getCompiledStatementQuery() {
    return "INSERT OR ROLLBACK INTO `ExpStatus`(`expUID`,`expNumber`,`expSpellName`,`isCheck`,`state`,`expTextName`) VALUES (?,?,?,?,?,?)";
  }

  @Override
  public final String getCreationQuery() {
    return "CREATE TABLE IF NOT EXISTS `ExpStatus`(`expUID` TEXT,`expNumber` TEXT NOT NULL,`expSpellName` TEXT NOT NULL,`isCheck` INTEGER,`state` INTEGER,`expTextName` TEXT, PRIMARY KEY(`expUID`)" + ");";
  }

  @Override
  public final void loadFromCursor(Cursor cursor, ExpStatus model) {
    int index_expUID = cursor.getColumnIndex("expUID");
    if (index_expUID != -1 && !cursor.isNull(index_expUID)) {
      model.setExpUID(cursor.getString(index_expUID));
    } else {
      model.setExpUID(null);
    }
    int index_expNumber = cursor.getColumnIndex("expNumber");
    if (index_expNumber != -1 && !cursor.isNull(index_expNumber)) {
      model.setExpNumber(cursor.getString(index_expNumber));
    } else {
      model.setExpNumber(null);
    }
    int index_expSpellName = cursor.getColumnIndex("expSpellName");
    if (index_expSpellName != -1 && !cursor.isNull(index_expSpellName)) {
      model.setExpSpellName(cursor.getString(index_expSpellName));
    } else {
      model.setExpSpellName(null);
    }
    int index_isCheck = cursor.getColumnIndex("isCheck");
    if (index_isCheck != -1 && !cursor.isNull(index_isCheck)) {
      model.setCheck(cursor.getInt(index_isCheck) == 1 ? true : false);
    } else {
      model.setCheck(false);
    }
    int index_state = cursor.getColumnIndex("state");
    if (index_state != -1 && !cursor.isNull(index_state)) {
      model.setState(cursor.getInt(index_state));
    } else {
      model.setState((int) 0);
    }
    int index_expTextName = cursor.getColumnIndex("expTextName");
    if (index_expTextName != -1 && !cursor.isNull(index_expTextName)) {
      model.setExpTextName(cursor.getString(index_expTextName));
    } else {
      model.setExpTextName(null);
    }
    model.getData();
  }

  @Override
  public final boolean exists(ExpStatus model, DatabaseWrapper wrapper) {
    return SQLite.selectCountOf()
    .from(ExpStatus.class)
    .where(getPrimaryConditionClause(model))
    .hasData(wrapper);
  }

  @Override
  public final OperatorGroup getPrimaryConditionClause(ExpStatus model) {
    OperatorGroup clause = OperatorGroup.clause();
    clause.and(expUID.eq(model.getExpUID()));
    return clause;
  }

  @Override
  public final boolean delete(ExpStatus model) {
    boolean successful = super.delete(model);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.delete();
      }
    }
    model.setData(null);
    return successful;
  }

  @Override
  public final boolean delete(ExpStatus model, DatabaseWrapper wrapper) {
    boolean successful = super.delete(model, wrapper);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.delete(wrapper);
      }
    }
    model.setData(null);
    return successful;
  }

  @Override
  public final boolean save(ExpStatus model) {
    boolean successful = super.save(model);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.save();
      }
    }
    return successful;
  }

  @Override
  public final long insert(ExpStatus model) {
    long rowId = super.insert(model);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.insert();
      }
    }
    return rowId;
  }

  @Override
  public final boolean update(ExpStatus model) {
    boolean successful = super.update(model);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.update();
      }
    }
    return successful;
  }

  @Override
  public final boolean save(ExpStatus model, DatabaseWrapper wrapper) {
    boolean successful = super.save(model, wrapper);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.save(wrapper);
      }
    }
    return successful;
  }

  @Override
  public final long insert(ExpStatus model, DatabaseWrapper wrapper) {
    long rowId = super.insert(model, wrapper);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.insert(wrapper);
      }
    }
    return rowId;
  }

  @Override
  public final boolean update(ExpStatus model, DatabaseWrapper wrapper) {
    boolean successful = super.update(model, wrapper);
    if (model.getData() != null)  {
      for (BaseModel value: model.getData())  {
        value.update(wrapper);
      }
    }
    return successful;
  }
}

Any help will be appreciate.

agrosner commented 7 years ago

this is a duplicate of #1281 .