无法将Room数据库数据加载至Spinner:GitHub API数据存储后无展示
问题分析与解决方案
嘿,我帮你找到了问题的核心所在,还有对应的修复方案:
1. 最关键的问题:数据库名称不匹配
你在Splash和Home两个页面里初始化Room数据库时,用了不同的数据库名称,这直接导致Home读取的是一个全新的空数据库,自然加载不到任何数据。
看一下代码对比:
- 在
Splash.java里,你给数据库命名为"MyDao":
myAppDatabase = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class, "MyDao").allowMainThreadQueries().build();
- 但在
Home.java里,数据库名称变成了"UsersDb":
myAppDatabase = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class,"UsersDb").allowMainThreadQueries().build();
Room会根据名称创建独立的数据库文件,所以这两个是完全分开的库。你需要把它们改成相同的名称,比如统一用"UsersDatabase":
修改Splash中的初始化代码:
myAppDatabase = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class, "UsersDatabase").allowMainThreadQueries().build();
修改Home中的初始化代码:
myAppDatabase = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class,"UsersDatabase").allowMainThreadQueries().build();
2. 额外的优化建议(可选但推荐)
- 别在主线程操作数据库:虽然
allowMainThreadQueries()暂时能运行,但实际项目中容易触发ANR(应用无响应)。建议改用异步方式,比如让Dao返回LiveData:
然后在Home中观察数据变化,自动更新Spinner:// MyDao.java修改 @Query("SELECT * FROM Users") LiveData<List<Users>> getUsers();// Home.java的putData方法替换成 myAppDatabase.myDao().getUsers().observe(this, usersList -> { userType.clear(); userType.add("Select UserType"); for(Users user : usersList){ userType.add(user.getType()); Log.e("DistNames",user.getType()); } spinner.setAdapter(new ArrayAdapter<>(Home.this, android.R.layout.simple_spinner_dropdown_item, userType)); }); - 确认数据插入成功:可以在Splash的
onResponse末尾加一行日志,验证插入的数据量:Log.e("插入的数据总数", String.valueOf(myAppDatabase.myDao().getUsers().size()));
3. 验证步骤
- 先卸载当前应用(清除旧的数据库文件)
- 重新运行应用,等待Splash完成数据加载
- 跳转到Home后,查看Spinner是否正常显示用户类型选项
内容的提问来源于stack exchange,提问作者Raj Sharma
相关产品推荐
相关产品推荐

