SQLite Room 数据库:接收来自特定列和行的数据不起作用?
SQLite Room Database: Receiving data from specific Column and Row not working?
我有一个包含 5 列(天、喜欢、不喜欢、播放、阻止)的 SQLite Room 数据库。我已经用数据库中的 8 行数据手动填充了数据库。
我想从数据库中检索特定日期的特定数据。所以我需要第 6 天(或 1、2、3、4...)的喜欢(或不喜欢、播放...)数量
我试图创建必要的 Dao
、Repository
和 ViewModel
方法,但它们似乎是错误的,因为当我在 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;
}
}
}
尝试下一个选项:
- 在您的 DAO 中显式设置列名
likes
(Room 不清楚您要使用哪个列作为 return 的值):
@Query("SELECT likes FROM recovery_table WHERE day=:day")
int getRecoveryWithDay(int day);
- 将你的 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 的行
我有一个包含 5 列(天、喜欢、不喜欢、播放、阻止)的 SQLite Room 数据库。我已经用数据库中的 8 行数据手动填充了数据库。
我想从数据库中检索特定日期的特定数据。所以我需要第 6 天(或 1、2、3、4...)的喜欢(或不喜欢、播放...)数量
我试图创建必要的 Dao
、Repository
和 ViewModel
方法,但它们似乎是错误的,因为当我在 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;
}
}
}
尝试下一个选项:
- 在您的 DAO 中显式设置列名
likes
(Room 不清楚您要使用哪个列作为 return 的值):
@Query("SELECT likes FROM recovery_table WHERE day=:day")
int getRecoveryWithDay(int day);
- 将你的 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 的行