【问题标题】:How to retrieve data from Room SQLite database?如何从 Room SQLite 数据库中检索数据?
【发布时间】:2020-07-18 16:55:35
【问题描述】:

所以我按照 youtube 上的教程创建了一个房间数据库。我有两列 day 和 likes,每个都持有 int 的。目前我已经用三行数据手动填充了数据库。

这里是手动填充数据库的代码:

@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().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) {
        // First input is the day and the second is the num of likes for that day
        recoveryDao.insert(new Recovery(6,1));
        recoveryDao.insert(new Recovery(7,2));
        recoveryDao.insert(new Recovery(8,3));
        return null;
    }
}

}

在我的 Dao 类中,我目前有 Insert、Update、deleteAll 和 getAll... 方法。 这是道:

@Dao
public interface RecoveryDao {

@Insert
void insert(Recovery recovery);

@Update
void update(Recovery recovery);


@Query("DELETE FROM recovery_table")
void deleteAllRecovery();

// Sends data from ascending day to the call. (1,2,3,4 ....)
@Query("SELECT * FROM RECOVERY_TABLE ORDER BY day ASC")
LiveData<List<Recovery>> getAllRecovery();

}

现在,我想从 Room 数据库中检索基于日期的数据。所以我想要第 6 天的点赞数,即 1。我想检索数据并将其存储到 mainActivity 中的 int 变量中。

所以我的最终目标是在数据库中有很多行数据并将其检索并存储到 ArrayList 中,但我必须首先弄清楚如何检索数据。

我已经尝试了很多来自 stackover flow 的解决方案,但我还没有弄清楚。 YT 上的所有教程都使用 Recycler 视图和适配器,但我不会使用它们。 我对 sqlite 和 MVVM 很陌生。谢谢你的帮助!!!

【问题讨论】:

标签: android mvvm android-sqlite android-room


【解决方案1】:

试试这个查询,你需要在参数中传递一天。

@Query("SELECT * FROM RECOVERY_TABLE WHERE day=:day ORDER BY day ASC ")
LiveData<List<Recovery>> getRecoveryWithDay(int day);

这将为您提供匹配日期的恢复列表,如果需要,您可以将返回类型从 LiveData&lt;List&lt;Recovery&gt;&gt; 更改为 List&lt;Recovery&gt;

如果您发现任何错误,请告诉我。

【讨论】:

  • 创建房间数据库时可以添加.allowMainThreadQueries()。这将允许您直接在主线程上运行查询。不推荐,但对于少量数据不会有问题。
  • Room.databaseBuilder(context.getApplicationContext(), RecoveryDatabase.class, "recovery_database").fallbackToDestructiveMigration().allowMainThreadQueries().addCallback(roomCallback).build();
  • 好的,我已将其添加到我的抽象 RecoveryDatabase 类中。我有用于更新、插入和其他东西的 asyncTask。
  • OK,所以我已经在ViewModel、Dao、Repository中添加了必要的方法。我如何在主要活动中调用它?我没有为新方法添加 asyncTask,因为我认为不需要它。
  • 只要在需要数据的地方调用dao方法即可。语法应该类似于List&lt;Recovery&gt; recoveryList=RecoveryDatabase.getInstance(this).recoveryDao().getRecoveryWithDay(6)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2021-12-02
  • 2019-02-21
  • 1970-01-01
相关资源
最近更新 更多