【问题标题】:SQLite Room Database: Receiving data from specific Column and Row not working?SQLite Room Database:从特定列和行接收数据不起作用?
【发布时间】:2020-07-19 13:07:13
【问题描述】:

我有一个包含 5 列(Day、Likes、Dislikes、plays、Blocked)的 SQLite Room Database。我已经在数据库中手动填充了 8 行数据。

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

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

数据库示例:

@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;
    }
}

}

【问题讨论】:

    标签: android android-studio android-sqlite android-room dao


    【解决方案1】:

    尝试下一个选项:

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

    然后你可以在你的活动中获得likes

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

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

    【讨论】:

    • 嘿,谢谢您的帮助。我已经完成了您的两个建议,他们都向我抛出了“无法创建类的实例 ... RecoveryViewModel .. 我认为我在存储库和 viewmodelclass 中做错了。我已经用更新的更改更新了问题。我还评论了我在哪里进行了更改,以便您更容易看到。您能否告诉我我必须进行的更改。再次感谢您。我理解更多。
    • 我对视图模型做了一个小改动,我得到 = java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.example.Recovery.getLikes()' on a null对象引用你知道我必须做什么来修复吗?
    • NullPointerException 表示RecoveryDatabase.getInstance(this).recoveryDao().getRecoveryWithDay(6) 为空(表示未找到第 6 天的行)。因此,您最好使用 sqlite 浏览器检查 day = 6 所需的数据是否确实存在。尝试首先本地化您的 can-find-row-problem 而不调用中间 ViewModel 和 Repository 的方法,因为至少在 Repository 中您使用不同的变量 - mDatabasedatabase
    • Android Studio 的 SQLite 浏览器 - here 其中之一(它是一个插件)。在新的 Android Studio 4.1 上有 built-in database Inspector
    • 您好,再次感谢您的帮助。我已经测试了所有内容,它按预期工作,我现在更好地理解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多