Метод insertAll ожидает, что массив объектов Task (Task[]
) не является единственным объектом Task.
Если вы хотите вставить один объект Task, вы можете добавить новыйметод вставки в DAO, например:
@Insert
void insertOneTask(Task task);
Альтернативно используйте массив из одного элемента с текущим методом insertAll .
например,
taskDAO.insertAll(new Task[]{task1});
, но я не могу ничего вставить в базу данных, и если я пытаюсь запросить предварительно загруженную задачу по ее идентификатору (0), она возвращает ноль.
Это потому, что при нормальных обстоятельствах никогда не будет задачи с идентификатором 0. Первый идентификатор будет 1.
Если вы использовали следующий код
List<Task> alltasks = roomDB.taskDAO().getAll();
for (Task t: alltasks) {
Log.d("TASKINFO","Task =" + t.getDescription() + " ID = " + t.getTaskId());
}
после / до или вместо Task task = roomDB.taskDAO().getTaskById(0)); //task is null
Будет показано, что идентификатор задачи равен 1.
например, 2019-09-29 20:00:20.463 D/TASKINFO: Task =Task data ID = 1
Комуобъяснение ROOM создаст таблицу для Задач, используя: -
CREATE TABLE IF NOT EXISTS `tasks` (`taskId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `Description` TEXT)
Столбец taskid, будет псевдонимом столбца rowid и, если не указано значение, или предоставленное значение равно нулю.Затем он автоматически сгенерирует значение для rowid и, следовательно, его псевдоним.Значение будет на 1 больше, чем наибольшее из последних записанных значений или самое высокое значение, которое в настоящее время находится в базе данных.Если таких значений нет, то значение будет 1 .
Если вы использовали
Task task = roomDB.taskDAO().getTaskById(1));
Вставленная задача будет возвращена.
Как правило, вы никогда не должны делать предположений о значении идентификатора, скорее его следует получать программно, обычно из списка, но с ROOM вы обычно имеете дело с объектами (например, getAll () и последующим циклом for).как указано выше)
Тестирование
Код был протестирован с использованием следующего: -
согласно: -
public class MainActivity extends AppCompatActivity {
AppDatabase roomDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
roomDB = AppDatabase.getAppDatabase(getApplicationContext());
new Thread(new Runnable() {
@Override
public void run() {
Task task = roomDB.taskDAO().getTaskById(0); //task is null
List<Task> alltasks = roomDB.taskDAO().getAll();
for (Task t: alltasks) {
Log.d("TASKINFO","Task =" + t.getDescription() + " ID = " + t.getTaskId());
}
}
}).start();
}
}