Кажется, с данным кодом все в порядке. Скорее, вы не проверяете возможный результат, что ничего не было возвращено из-за того, что id не является идентификатором Item.
Это использует класс Item, как указано выше, вместе со слегка измененным ItemDao (чтобы позволитьвставляет) в соответствии с: -
@Dao
public interface ItemDao {
@Query("SELECT * FROM Item WHERE I_ID = :iId")
Item getItemById(int iId);
@Insert
long insert(Item item); //<<<<<<<<<< ADDED
}
С @Database: -
@androidx.room.Database(version = 1,entities = {Item.class})
public abstract class Database extends RoomDatabase {
public abstract ItemDao itemDao();
}
и следующим кодом в упражнении: -
public class MainActivity extends AppCompatActivity {
Database mDB;
ItemDao mItemDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDB = Room.databaseBuilder(this,Database.class,"mydb")
.allowMainThreadQueries()
.build();
mItemDao = mDB.itemDao();
mItemDao.insert(new Item(1,"Item1"));
mItemDao.insert(new Item(2,"Item2"));
logItemInfo(mItemDao.getItemById(1));
logItemInfo(mItemDao.getItemById(2));
}
private void logItemInfo(Item i) {
Log.d("ITEMINFO","Item is " + i.getIName() + " ID is " + i.getIId());
}
}
результирующий вывод в журнале: -
2019-10-02 07:36:41.180 D/ITEMINFO: Item is Item1 ID is 1
2019-10-02 07:36:41.181 D/ITEMINFO: Item is Item2 ID is 2
Похоже, ваша проблема в том, что вы, скорее всего, передаете идентификатор для выбора, который на самом деле не является идентификатором.
Например,использование: -
mItemDao.deleteAllItems(); //<<<<<<<<<<< Added to Item Dao as @Query("DELETE FROM Item") to make this rerunnable
mItemDao.insert(new Item(1,"Item1")); //<<<<<<<<<< AS WAS
mItemDao.insert(new Item(2,"Item2")); //<<<<<<<<<< AS WAS
logItemInfo(mItemDao.getItemById(1)); //<<<<<<<<<< AS WAS
logItemInfo(mItemDao.getItemById(2)); //<<<<<<<<<< AS WAS
logItemInfo(mItemDao.getItemById(100)); //<<<<<<<<<< ATTEMPT TO GET AN INVALID ID
В результате возникает исключение пустого указателя (когда делается попытка получить доступ к элементу в методе logItemInfo), поскольку нет элемента с идентификатором 100 ,которая является вероятной причиной описанной вами проблемы (т.е. вы запрашиваете несуществующую строку).
Изменение метода logItemInfo следующим образом: -
private void logItemInfo(Item i) {
if (i == null) {
Log.d("ITEMINFO","NOT AN ITEM");
return;
}
Log.d("ITEMINFO","Item is " + i.getIName() + " ID is " + i.getIId());
}
Результирующий вывод (вместо исключения): -
2019-10-02 07:57:21.189 11388-11388/aso.asofkinroom D/ITEMINFO: Item is Item1 ID is 1
2019-10-02 07:57:21.190 11388-11388/aso.asofkinroom D/ITEMINFO: Item is Item2 ID is 2
2019-10-02 07:57:21.190 11388-11388/aso.asofkinroom D/ITEMINFO: NOT AN ITEM