Java Android:获取房间数据库中带有特定代码的项目数
我基本上是在尝试创建某种搜索功能。我使用的是一个房间数据库,每个元素都有一个由用户提交的特定的3位数代码。但是,当我尝试获取具有特定3位代码的元素数并将其显示在主活动中的Toast消息中时,结果总是得到0 我的表的每个实体都是我创建的Word类的对象,如下所示:Java Android:获取房间数据库中带有特定代码的项目数,java,android,sql,android-studio,android-room,Java,Android,Sql,Android Studio,Android Room,我基本上是在尝试创建某种搜索功能。我使用的是一个房间数据库,每个元素都有一个由用户提交的特定的3位数代码。但是,当我尝试获取具有特定3位代码的元素数并将其显示在主活动中的Toast消息中时,结果总是得到0 我的表的每个实体都是我创建的Word类的对象,如下所示: @Entity(tableName = "word_table") public class Word { @PrimaryKey(autoGenerate = true) @NonNull private in
@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);
}
@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;
}
}
}
经过一些搜索后,我认为使用LiveData和观察者更可取。
但是,当我运行应用程序时,我得到的不是Toast消息中的1,而是0
我是android开发新手,所以我为混乱的代码和粘贴所有这些代码道歉。我一直在通过Google Codelabs教程学习Room,所以如果对Room有更好的了解可以解决我的问题,请随时向我推荐任何学习资源。
提前谢谢 您实际上是在搜索
word
而不是wordCode
在WordDao
@Query("SELECT COUNT(*) FROM word_table WHERE word_code = :selectedCode")
LiveData<Integer> getWordWithCode
@Query(“从word\u表中选择COUNT(*),其中word\u code=:selectedCode”)
LiveData getWordWithCode
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);
}
}
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();
}
});
}
}
@Query("SELECT COUNT(*) FROM word_table WHERE word = :selectedCode")
int getWordWithCode(int selectedCode);
@Query("SELECT COUNT(*) FROM word_table WHERE word_code = :selectedCode")
LiveData<Integer> getWordWithCode