【问题标题】:getId() method of Entity generates label collisions in DAO_ImplEntity 的 getId() 方法在 DAO_Impl 中生成标签冲突
【发布时间】:2018-11-12 18:56:47
【问题描述】:

在使用 Android Room 时,我注意到我的 DAO 生成的实现没有可以理解的错误。首先我需要提一下,我正在制作我的应用程序作为对Android Room with a View 的修改。

我有一个任务类:

app/java/com.example.blah/Task.java:

package ...

import ...

@Entity
public class Task {

    @PrimaryKey(autoGenerate = true)
    @NonNull
    @ColumnInfo(name = "id")
    protected int _id;

    @NonNull
    @ColumnInfo(name = "description")
    protected String _description;

    public Task(@NonNull String description) {
        _description = description;

    }

    public int getId() {
        return _id;
    }

    public String getDescription() {return _description;}
}

当我尝试构建此代码时,我从生成的类之一中收到编译错误:

app/生成的Java/com.example.blah/TaskDAO_Impl.java 包...

import ...

@SuppressWarnings("unchecked")
public class TaskDAO_Impl implements TaskDAO {
  private final RoomDatabase __db;

  private final EntityInsertionAdapter __insertionAdapterOfTask;

  private final SharedSQLiteStatement __preparedStmtOfDeleteAll;

  public TaskDAO_Impl(RoomDatabase __db) {
    this.__db = __db;
    this.__insertionAdapterOfTask = new EntityInsertionAdapter<Task>(__db) {
      @Override
      public String createQuery() {
        return "INSERT OR ABORT INTO `Task`(`id`,`description`) VALUES (nullif(?, 0),?)";
      }

      @Override
      public void bind(SupportSQLiteStatement stmt, Task value) {
        stmt.bindLong(1, value.getId());
        if (value.getDescription() == null) {
          stmt.bindNull(2);
        } else {
          stmt.bindString(2, value.getDescription());
        }
      }
    };
    this.__preparedStmtOfDeleteAll = new SharedSQLiteStatement(__db) {
      @Override
      public String createQuery() {
        final String _query = "DELETE FROM Task";
        return _query;
      }
    };
  }

  @Override
  public void insert(Task task) {
    __db.beginTransaction();
    try {
      __insertionAdapterOfTask.insert(task);
      __db.setTransactionSuccessful();
    } finally {
      __db.endTransaction();
    }
  }

  @Override
  public void deleteAll() {
    final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteAll.acquire();
    __db.beginTransaction();
    try {
      _stmt.executeUpdateDelete();
      __db.setTransactionSuccessful();
    } finally {
      __db.endTransaction();
      __preparedStmtOfDeleteAll.release(_stmt);
    }
  }

  @Override
  public LiveData<List<Task>> getAllTasks() {
    final String _sql = "SELECT * FROM Task ORDER BY description ASC";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
    return new ComputableLiveData<List<Task>>() {
      private Observer _observer;

      @Override
      protected List<Task> compute() {
        if (_observer == null) {
          _observer = new Observer("Task") {
            @Override
            public void onInvalidated(@NonNull Set<String> tables) {
              invalidate();
            }
          };
          __db.getInvalidationTracker().addWeakObserver(_observer);
        }
        final Cursor _cursor = __db.query(_statement);
        try {
          final int _cursorIndexOfId = _cursor.getColumnIndexOrThrow("id");
          final int _cursorIndexOfDescription = _cursor.getColumnIndexOrThrow("description");
          final List<Task> _result = new ArrayList<Task>(_cursor.getCount());
          while(_cursor.moveToNext()) {
            final Task _item;
            final String _tmp_description;
            _tmp_description = _cursor.getString(_cursorIndexOfDescription);
            _item.getId = _cursor.getInt(_cursorIndexOfId);
            final String _tmp_1;
            _tmp_1 = _cursor.getString(_cursorIndexOfActivationDate);
            _item._activationDate = DateStringConverter.intoDate(_tmp_1);
            _item.points = _cursor.getInt(_cursorIndexOfPoints);
            _result.add(_item);
          }
          return _result;
        } finally {
          _cursor.close();
        }
      }

      @Override
      protected void finalize() {
        _statement.release();
      }
    }.getLiveData();
  }
}

还有这一行:

_item.getId = _cursor.getInt(_cursorIndexOfId);

导致错误:

错误:找不到符号变量getId

因为Task类中没有getId字段。请注意,上面提到的课程不是我写的。它由 Android Studio 自动生成。

我想知道为什么会这样?如果我从 Task 类中删除函数 getId() ,一切都会好起来的。对于上面提到的生成代码,一旦我删除 getId() 函数,可疑行变成:

_item._id = _cursor.getInt(_cursorIndexOfId);

一切正常编译。谁能解释一下?

【问题讨论】:

    标签: android dao


    【解决方案1】:

    Task 类中声明int getId; 变量。这是不寻常的情况。可能是Room Persistence Library 的错误。

    也许这种方法不是解决问题的真正方法,但它确实有效 至少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多