【发布时间】: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);
一切正常编译。谁能解释一下?
【问题讨论】: