Я не заметил понятной ошибки сгенерированной реализации для моего DAO при использовании Android Room.Прежде всего, я должен отметить, что я делаю свое приложение как модификацию Android Room с View * .
У меня есть класс для Task:
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 / generateJava / 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.
Интересно, почему это произошло?Если я удалю функцию getId () из класса Task, все станет хорошо.Для сгенерированного кода, упомянутого выше, как только я удаляю функцию getId (), подозрительная строка превращается в:
_item._id = _cursor.getInt(_cursorIndexOfId);
И все компилируется нормально.Кто-нибудь может это объяснить?