SQLite Room 数据库:接收来自特定列和行的数据不起作用?

SQLite Room Database: Receiving data from specific Column and Row not working?

我有一个包含 5 列(天、喜欢、不喜欢、播放、阻止)的 SQLite Room 数据库。我已经用数据库中的 8 行数据手动填充了数据库。

我想从数据库中检索特定日期的特定数据。所以我需要第 6 天(或 1、2、3、4...)的喜欢(或不喜欢、播放...)数量

我试图创建必要的 DaoRepositoryViewModel 方法,但它们似乎是错误的,因为当我在 MainActivity 中调用它时,它给了我 0作为 return 值。

数据库示例:

@Database(entities = Recovery.class, version = 1, exportSchema = false)
public abstract class RecoveryDatabase extends RoomDatabase {

private static RecoveryDatabase INSTANCE;
public abstract RecoveryDao recoveryDao();

// Singleton
public static RecoveryDatabase getInstance(final Context context) {
    if (INSTANCE == null) {
        synchronized (RecoveryDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(), RecoveryDatabase.class, "recovery_database").fallbackToDestructiveMigration().allowMainThreadQueries().addCallback(roomCallback).build();
            }
        }
    }
    return INSTANCE;
}

private static RecoveryDatabase.Callback roomCallback = new RoomDatabase.Callback() {
    @Override
    public void onCreate(@NonNull SupportSQLiteDatabase db) {
        super.onCreate(db);
        new PopulateDbAsyncTask(INSTANCE).execute();
    }
};

private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
    private RecoveryDao recoveryDao;

    private PopulateDbAsyncTask(RecoveryDatabase db) {
        recoveryDao = db.recoveryDao();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        recoveryDao.insert(new Recovery(1,22,9,2,3));
        recoveryDao.insert(new Recovery(2,23,8,3,4));
        recoveryDao.insert(new Recovery(3,56,6,4,5));
        recoveryDao.insert(new Recovery(4,34,4,2,2));
        recoveryDao.insert(new Recovery(5,76,2,7,9));
        recoveryDao.insert(new Recovery(6,10,1,4,7));
        recoveryDao.insert(new Recovery(7,27,6,7,3));
        recoveryDao.insert(new Recovery(8,46,7,1,5));
        return null;
    }
}

}

尝试下一个选项:

  1. 在您的 DAO 中显式设置列名 likes(Room 不清楚您要使用哪个列作为 return 的值):
@Query("SELECT likes FROM recovery_table WHERE day=:day")
int getRecoveryWithDay(int day);
  1. 将你的 DAO return 的值类型更改为 Recovery(如果你想获得多个值,这是更好的选择 - 喜欢,不喜欢,玩一个查询):
@Query("SELECT * FROM recovery_table WHERE day=:day")
Recovery getRecoveryWithDay(int day);

然后您可以在 Activity:

中获得 likes
int day = RecoveryDatabase.getInstance(this).recoveryDao().getRecoveryWithDay(6).likes;

如果这两个选项都不起作用,请使用某些 sqlite 浏览器检查您的数据库中是否真的有 day = 6 的行