客房"Not sure how to convert a Cursor to this method's return type"



我是android开发的新手,我正在做一个名为"饮水提醒".这是我的Dao和数据库代码。Room不确定如何将光标转换为此方法的返回类型错误每次我运行应用程序,所以我搜索了这个,我得到的是">不要使用带有suspend关键字的LiveData。我没有同时使用这两个,但我仍然得到这个错误。有人能帮忙吗?

@Dao
interface Dao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user :User)
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertDrinkData(drink: Drink)
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertNotificationInfo(notification : Notification)
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun updateUser(user: User)
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun updateNotificationInfo(notification: Notification)
@Delete
suspend fun deleteSelectedDrinkData(drink : Drink)
@Query("SELECT *FROM User_table")
fun getAllUsers() : LiveData<List<User>>
@Query("SELECT * FROM $USER_TABLE_NAME LIMIT 1")
suspend fun readUserData() : User
@Query("SELECT * FROM $USER_TABLE_NAME LIMIT 1")
fun readData() : LiveData<User>
@Query("SELECT * FROM $USER_TABLE_NAME LIMIT 1")
suspend fun readNotificationData() : Notification
@Query("SELECT $COLUMN_DATE_DRINK , SUM($COLUMN_AMOUNT_DRINK) as Total GROUP BY $COLUMN_DATE_DRINK")
suspend fun readDrinkSumData() : MutableList<Sum>
@Query("SELECT $COLUMN_DATE_DRINK , SUM($COLUMN_AMOUNT_DRINK) as Total GROUP BY $COLUMN_DATE_DRINK")
fun readDrinkData() : LiveData<MutableList<Sum>>
@Query("SELECT * FROM $USER_TABLE_NAME WHERE $COLUMN_DATE_DRINK = :date")
suspend fun readDrinkDataSelectedDay(date:String): MutableList<Drink>

}

@Database(entities = [User::class,Drink::class,Notification::class],
version = DATABASE_VERSION)abstract class AppDataBase : RoomDatabase() {
abstract val daoInstance : Dao
companion object {
private var INSTANCE : AppDataBase? = null
fun getInstance(context : Context) : AppDataBase {
synchronized(this) {
var instance : AppDataBase? = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
AppDataBase::class.java,
"AppDataBase"
).build()
}
return instance
}
}
}}

class AppRepository(private val dao: Dao) {
fun readData() : LiveData<User> = dao.readData()
fun readDrinkData(): LiveData<MutableList<Sum>> = dao.readDrinkData()
suspend fun insertUser(user :User): Unit = dao.insertUser(user)
suspend fun insertDrinkData(drink: Drink): Unit = dao.insertDrinkData(drink)
suspend fun insertNotificationInfo(notification : Notification): Unit = dao.insertNotificationInfo(notification)
suspend fun updateUser(user: User) : Unit = dao.updateUser(user)
suspend fun updateNotificationInfo(notification: Notification): Unit = dao.updateNotificationInfo(notification)
suspend fun readUserData() : User = dao.readUserData()
suspend fun readNotificationData() : Notification = dao.readNotificationData()
suspend fun deleteSelectedDrinkData(drink : Drink): Unit = dao.deleteSelectedDrinkData(drink)
suspend fun readDrinkSumData(): MutableList<Sum>? = dao.readDrinkSumData()
suspend fun readDrinkDataSelectedDay(date: String): MutableList<Drink>? {
return dao.readDrinkDataSelectedDay(date)
}

这是我的房间版本:2.4.2

,这是错误:输入图片描述

不要使用LiveData作为返回类型
使用:

fun readDrinkData() : MutableList<Sum>

代替:

fun readDrinkData() : LiveData<MutableList<Sum>>

如果你想在你的房间模型中使用复杂的对象,你必须为这些类型添加一个room - converter。阅读本文:使用Room引用复杂数据。
例如,您可以使用GSON将它们转换为json-string

class MyModel (
var key: String,
var value: String,
)
class MySuperModel (
var name: String,
var data: MyModel,
)
object Converters {
@TypeConverter
fun fromJsonString(String srtJson): MyModel {
return Gson().fromJson(srtJson, MyModel.class);
}
@TypeConverter
fun toJsonString(MyModel data): String {
return Gson().toJson(data);
}
}

然后你必须添加你的转换器到你的数据库:

@Database(entities = {MySuperModel.class})
@TypeConverters({Converters.class})
class MyDatabase : RoomDatabase

在代码中使用suspend关键字:readUserData(): User = dao.readUserData()所以它会抛出相关的错误。我建议你不要在这一层使用LiveData。你可能很快就会面临其他问题。只需返回数据实体并在视图模型中更新实时数据。

相关内容

最新更新