当前位置: 首页 > 知识库问答 >
问题:

Android房间--“不知道如何将这个字段保存到数据库中。”

逄俊贤
2023-03-14

我试图创建Room数据库并向其插入值,但我得到了这个错误:

公共抽象类WeatherDatabase扩展了AndroidX.Room.RoomDatabase{^error:无法知道如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mDatabase:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mCallbacks:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mQueryExecutor:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mTransactionExecutor:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。-AndroidX.Room.RoomDatabaseError中的mOpenHelper:无法知道如何将此字段保存到数据库中。可以考虑为它添加类型转换器。-AndroidX.Room.RoomDatabaseError中的mInvalidationTracker:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。-AndroidX.room.RoomDatabaseError中的mCloseLock:无法知道如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mSuspendingTransactionId:无法确定如何将此字段保存到数据库中。可以考虑为它添加类型转换器。AndroidX.Room.RoomDatabaseError中的-mBackingFieldMap:找不到字段的getter。-AndroidX.Room.RoomDatabaseError中的mAllowMainThreadQueries:找不到字段的getter。-AndroidX.Room.RoomDatabaseError中的mCloseLock:找不到字段的getter。-AndroidX.Room.RoomDatabaseError中的mSuspendingTransactionId:找不到字段的getter。AndroidX.Room.RoomDatabaseError中的-mBackingFieldMap:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mQueryExecutor:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mTransactionExecutor:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mOpenHelper:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mInvalidationTracker:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mAllowMainThreadQueries:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mCloseLock:找不到字段的setter。-AndroidX.Room.RoomDatabaseError中的mSuspendingTransactionId:找不到字段的setter。-mBackingFieldMap在AndroidX.room.RoomDatabasec中:\users\ceran\desktop\projid\simpleweatherapp\app\build\tmp\kapt3\stubs\debug\com\example\simpleweatherapp\database:11:error:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:databaseweather)public抽象^C:\users\ceran\desktop\projekty\android\simpleweatherapp\app\build\tmp\kapt3\stubs\debug\com\example\simpleweatherapp\database\weatherdao.java:14:error:com.example.simpleweatherapp.database.weatherdatabase是com.example.simpleweatherapp.database.weatherdatabase的一部分,但是这个实体不在数据库中。也许您忘记将com.example.simpleweatherapp.database.databaseWeather添加到@database的实体部分?

它很长,但它重复了同样的句子“不知道如何将该字段保存到数据库中。你可以考虑为它添加一个类型转换器。”我该怎么办?下面是我的代码:


@Entity(tableName = "current_weather")
data class DatabaseWeather constructor(
    val name: String,
    val lon: Double,
    val lat: Double,
    val description: String,
    val icon: String,
    val temp: Double,
    val tempFeelsLike: Double,
    val humidity: Int,
    val pressure: Int
){
    @PrimaryKey(autoGenerate = false)
    var id: Int = WEATHER_ID
}

fun DatabaseWeather.asDomainModel(): CurrentWeather{
    return CurrentWeather(
        name = this.name,
        lon = this.lon,
        lat = this.lat,
        description = this.description,
        icon = this.icon,
        temp = this.temp,
        tempFeelsLike = this.tempFeelsLike,
        humidity = this.humidity,
        pressure = this.pressure
    )
}


@Dao
interface WeatherDao{

    @Query("select * from current_weather where id = $WEATHER_ID")
    fun getWeather(): LiveData<DatabaseWeather>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(weather: DatabaseWeather)
}

@Database(entities = [WeatherDatabase::class], version = 1)
abstract class WeatherDatabase: RoomDatabase(){
    abstract val weatherDao: WeatherDao
}

private lateinit var INSTANCE: WeatherDatabase

fun getDatabase(context: Context): WeatherDatabase{
    synchronized(WeatherDatabase::class.java){
        if (!::INSTANCE.isInitialized){
            INSTANCE = Room.databaseBuilder(context.applicationContext,
            WeatherDatabase::class.java, "weather_db").build()
        }
    }
    return INSTANCE
}

共有1个答案

翟光赫
2023-03-14

您将WeatherDatabase作为WeatherDatabase的实体,而是提供DatabaseWeather

@Database(entities = [DatabaseWeather::class], version = 1)
abstract class WeatherDatabase: RoomDatabase(){
    abstract val weatherDao: WeatherDao
}
 类似资料: