繁体   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