Метод getId () Entity генерирует конфликты меток в DAO_Impl - PullRequest
0 голосов
/ 12 ноября 2018

Я не заметил понятной ошибки сгенерированной реализации для моего 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);

И все компилируется нормально.Кто-нибудь может это объяснить?

1 Ответ

0 голосов
/ 30 апреля 2019

Объявите int getId; переменную в вашем Task классе .. Это необычная ситуация .. Возможно, это ошибка Room Persistence Library ..

Возможно, этот метод не является верным способомрешить проблему, но она работает по крайней мере.

...