簡體   English   中英

從房間數據庫獲取數組 - Android, Kotlin

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM