【问题标题】:Android: Getting the count of items with a specific code in a Room databaseAndroid:获取房间数据库中具有特定代码的项目数
【发布时间】:2019-08-31 19:57:24
【问题描述】:

我实际上是在尝试创建某种搜索功能。我正在使用 Room 数据库,每个元素都有用户提交的特定 3 位数代码。但是,当我尝试获取具有特定 3 位数代码的元素数量并将其显示在 Main Activity 的 Toast 消息中时,结果总是为 0。

我的表的每个实体都是我创建的 Word 类的对象,如下所示:

@Entity(tableName = "word_table")
public class Word {
    @PrimaryKey(autoGenerate = true)
    @NonNull
    private int uid;

    @ColumnInfo(name = "word_code")
    private int wordCode;

    @ColumnInfo(name = "word")
    private String word;

    public Word(int uid, int wordCode, String word){
        this.uid = uid;
        this.wordCode = wordCode;
        this.word = word;
    }
    public int getUid(){
        return uid;
    }
    public int getWordCode(){
        return wordCode;
    }
    public String getWord(){
        return word;
    }
}

我的 DAO 类如下所示:

@Dao
public interface WordDao {
    @Insert
    void insert(Word word);


    @Query("SELECT COUNT(*) FROM word_table WHERE word = :selectedCode")
    LiveData<Integer> getWordWithCode(int selectedCode);


}

我的扩展 RoomDatabase 的类如下所示:

@Database(entities = {Word.class}, version = 1, exportSchema = false)
public abstract class WordRoomDatabase extends RoomDatabase {
    public abstract WordDao wordDao();

    private static WordRoomDatabase INSTANCE;
    public static WordRoomDatabase getDatabase(final Context context){
        if (INSTANCE == null){
            synchronized (WordRoomDatabase.class){
                if (INSTANCE==null){
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordRoomDatabase.class, "word_database")
                    .fallbackToDestructiveMigration()
                            .addCallback(sDatabasePopulateCallback)
                    .build();
                }
            }
        }
        return INSTANCE;
    }
    private static RoomDatabase.Callback sDatabasePopulateCallback = new RoomDatabase.Callback(){
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            new PopulateDatabaseAsync(INSTANCE).execute();
        }
    };
    private static class PopulateDatabaseAsync extends AsyncTask<Void, Void, Void> {
        private WordDao mWordDao;
        PopulateDatabaseAsync(WordRoomDatabase db){
            mWordDao = db.wordDao();
        }
        int[] discCodes = {232, 432, 523,233,242,554,221};
        String[] discNames = {"First Word", "Second Word", "Third Word", "Fourth Word", "Fifth Word", "Sixth word", "Seventh Word"};
        @Override
        protected Void doInBackground(Void... voids) {
            for (int i = 0;i < discCodes.length; i++){
                Word newWord = new Word(0, discCodes[i], discNames[i]);
                mWordDao.insert(newWord);
            }
            return null;
        }
    }
}

我正在使用 discCodes 和 discNames 数组来填充列表作为示例。

这是我的存储库的样子:

public class WordRepository {
    private WordDao mWordDao;
    private LiveData<Integer> mCount;

    int thiscount;

    WordRepository(Application application){
        WordRoomDatabase db = WordRoomDatabase.getDatabase(application);
        mWordDao = db.wordDao();
    }

    public void insert(Word word){
        new insertWordAsync(mWordDao).execute(word);
    }
    private static class insertWordAsync extends AsyncTask<Word, Void, Void>{
        private WordDao mDao;
        insertWordAsync(WordDao dao){
            mDao = dao;
        }
        @Override
        protected Void doInBackground(Word... words) {
            mDao.insert(words[0]);
            return null;
        }
    }

    public LiveData<Integer> getCount(int givenCode){
        return mWordDao.getWordWithCode(givenCode);
    }

}

这是 ViewModel 类:

public class WordViewModel extends AndroidViewModel {
    private WordRepository mRepo;

    public WordViewModel(@NonNull Application application) {
        super(application);
        mRepo = new WordRepository(application);

    }
    public void insert(Word word){
        mRepo.insert(word);
    }


    public LiveData<Integer> getCount(int givenCode){
        return mRepo.getCount(givenCode);
    }
}

最后是 MainActivity 类:

public class MainActivity extends AppCompatActivity {
    private WordViewModel mWordViewModel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWordViewModel = ViewModelProviders.of(this).get(WordViewModel.class);


        mWordViewModel.getCount(242).observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                String toShow = Integer.toString(integer);
                Toast.makeText(getApplicationContext(), toShow, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

现在,在这个特定示例中,我使用代码 242 作为搜索的基础。我首先尝试使用 int 的返回类型而不是 LiveData,这意味着我的 DAO 查询会像这样:

@Query("SELECT COUNT(*) FROM word_table WHERE word = :selectedCode")
    int getWordWithCode(int selectedCode);

经过一番搜索,我发现使用 LiveData 和 Observer 更可取。 但是,当我运行应用程序时,我得到的不是 1 在 Toast 消息中,而是 0。

我是 android 开发的新手,所以我为混乱的代码和粘贴所​​有这些代码表示歉意。我一直在通过 Google Codelabs 教程学习 Room,如果对 Room 有更好的理解可以解决我的问题,请随时向我推荐任何学习资源。 提前致谢!

【问题讨论】:

    标签: java android sql android-studio android-room


    【解决方案1】:

    您实际上是在搜索 word 而不是 wordCode

    WordDao试试这个代码

    @Query("SELECT COUNT(*) FROM word_table WHERE word_code = :selectedCode")
    LiveData<Integer> getWordWithCode
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2020-07-09
      • 1970-01-01
      • 2011-04-02
      • 2020-05-06
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多