【发布时间】: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