[英]Obtaining an array from room Database - Android, Kotlin
我是 Room Database 的新手,我想從一個數據庫中提取一個 int 數組。 我認為問題出在片段的代碼中,當我想使用 function “stationlist”來獲取數據庫中存在的電台代碼數組時。 output“StationList”似乎是 Unit 而不是 Array:有人知道解決方案嗎? 謝謝
這是我的實體和數據 class:
@Parcelize
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int,
val Name: String,
val StationCode: Int
): Parcelable
這是我的道:
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addUser(user: User)
@Query("SELECT intArrayOf(StationCode) FROM user_table")
suspend fun stationlist() : Array
}
這是我的數據庫:
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabase(context: Context): UserDatabase{
val tempInstance = INSTANCE
if(tempInstance != null){
return tempInstance
}
synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_database"
).build()
INSTANCE = instance
return instance
}
}
}
}
這是我的存儲庫:
class UserRepository(private val userDao: UserDao) {
val readAllData: LiveData<List<User>> = userDao.readAllData()
suspend fun addUser(user: User){
userDao.addUser(user)
}
suspend fun stationlist(){
userDao.stationlist()
}
}
這是我的視圖模型:
class UserViewModel(application: Application): AndroidViewModel(application) {
val readAllData: LiveData<List<User>>
private val repository: UserRepository
init {
val userDao = UserDatabase.getDatabase(
application
).userDao()
repository = UserRepository(userDao)
readAllData = repository.readAllData
}
fun addUser(user: User){
viewModelScope.launch(Dispatchers.IO) {
repository.addUser(user)
}
}
fun stationlist(){
viewModelScope.launch(Dispatchers.IO) {
repository.stationlist()
}
}
}
最后這是片段的一部分:
class AddFragment : Fragment(), OnMapReadyCallback {
private lateinit var mUserViewModel: UserViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// here is all the part regarding displaying the layout and collecting data
mUserViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
view.add_btn.setOnClickListener {
insertDataToDatabase()
}
return view
}
private fun insertDataToDatabase() {
if(inputCheck(name, stationcode)){
val user = User(
0,
name,
stationcode)
mUserViewModel.addUser(user)
// Here is the problem:
val StationList= mUserViewModel.stationlist()
}
問題在於道法。 用這個改變它:
@Query("SELECT StationCode FROM user_table")
suspend fun stationlist() : Array<Int>
編輯
協程還有其他一些問題。 在片段中你稱之為:
val StationList= mUserViewModel.stationlist()
但是這個方法不會立即返回。
fun stationlist(){
viewModelScope.launch(Dispatchers.IO) {
repository.stationlist()
}
}
您應該實現一個實時數據數組,該數組在異步數據庫查詢返回時更新。 這樣:
val stationList: MutableLiveData<Array<Int>>() = MutableLiveData()
fun stationlist(){
viewModelScope.launch(Dispatchers.IO) {
stationList.value = repository.stationlist()
}
}
在片段中,您必須觀察列表:
mUserViewModel.stationList.observe(viewLifecycleOwner) { array ->
// do stuff
}
您還必須更改存儲庫stationlist()
返回類型:
suspend fun stationlist(): Array<Int> {
return userDao.stationlist()
}
這些是了解協程、房間和實時數據的有用鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.