Запрос номера с идентификатором возвращает ноль - PullRequest
1 голос
/ 01 октября 2019

Я использую Room Persistance Library для своей базы данных. Один из моих запросов возвращает null, и я не понимаю, почему:

Entity:

@Entity
public class Item{

    @PrimaryKey (autoGenerate = true)
    @ColumnInfo (name = "I_ID")
    private final int iId;

    @ColumnInfo (name = "I_Name")
    private final String iName;

    public int getIId() {
        return iId;
    }

    public String getIName() {
        return iName;
    }

    public Item(int iId, String iName) {
        this.iId = iId;
        this.iName = iName;
    }
}

Dao:

@Dao
public interface ItemDao {
    @Query("SELECT * FROM Item WHERE I_ID = :iId")
    Item getItemById(int iId);
}

В этом запросе отображается предупреждение: Return value of the method is never used. И он всегда возвращает ноль, даже когда я уверен, что элемент с данным идентификатором существует в базе данных. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Кажется, с данным кодом все в порядке. Скорее, вы не проверяете возможный результат, что ничего не было возвращено из-за того, что 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
0 голосов
/ 01 октября 2019

я нашел попробуйте использовать вот так:

@Dao
public interface ItemDao {
@Query("SELECT * FROM item WHERE I_ID = :iId")
List<Item> getItemById(int iId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...