Android Room 数据库上的类型转换器错误

Gab*_*ode 10 android typeconverter kotlin android-room

java.lang.IllegalArgumentException:数据库配置中缺少 ArticlesDao 所需的类型转换器(类 SourceConverter)。

我在编译(运行时)我的应用程序时发生崩溃,因为根据显示的错误,我的数据库配置中缺少转换器。我该如何解决这个问题?我需要帮助。

源码如下:

源转换器.kt

@ProvidedTypeConverter
internal class SourceConverter {
    @TypeConverter
    fun stringToSource(string: String?): SourceEntity = Gson().fromJson(string, SourceEntity::class.java)

    @TypeConverter
    fun sourceToString(list: SourceEntity?): String = Gson().toJson(list)
}
Run Code Online (Sandbox Code Playgroud)

文章实体.kt

@Entity(tableName = "article")
data class ArticleEntity(

    @TypeConverters(SourceConverter::class)
    @SerializedName("source")
    var source: SourceEntity? = null,

    @SerializedName("author")
    var author: String? = null,

    @SerializedName("title")
    var title: String? = null,

    @SerializedName("description")
    var description: String? = null,

    @SerializedName("url")
    @NonNull @PrimaryKey var url: String,

    @SerializedName("urlToImage")
    var urlToImage: String? = null,

    @SerializedName("publishedAt")
    var publishedAt: String? = null,

    @SerializedName("content")
    var content: String? = null

)
Run Code Online (Sandbox Code Playgroud)

文章道.kt

@Dao
interface ArticlesDao {

    @Query("select * from article where url = :primaryId")
    fun findByPrimaryId(primaryId: String?): ArticleEntity?

    @Query("DELETE FROM article WHERE url = :primaryId")
    fun deleteByPrimaryId(primaryId: String?): Int

    @Query("SELECT * FROM article")
    fun getAllArticles(): Flow<List<ArticleEntity>>

    @Query("DELETE FROM article")
    fun clear()

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(articleEntity: ArticleEntity?): Long

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(vararg articleEntities: ArticleEntity?): LongArray?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(articleEntityList: List<ArticleEntity?>?): LongArray?

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun update(articleEntity: ArticleEntity?): Int

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun update(vararg articleEntities: ArticleEntity?): Int

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun update(articleEntityList: List<ArticleEntity?>?): Int

    @Delete
    fun delete(articleEntity: ArticleEntity?): Int
}
Run Code Online (Sandbox Code Playgroud)

应用程序数据库.kt

@Database(entities = [ArticleEntity::class, SourceEntity::class], version = 1, exportSchema = false)
    @TypeConverters(SourceConverter::class, ArticleConverter::class)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun getArticlesDao(): ArticlesDao
        abstract fun getSourcesDao(): SourcesDao
    
        companion object {
            @Synchronized
            fun getInstance(context: Context): AppDatabase {
                if (sInstance == null) {
                    sInstance = Room
                        .databaseBuilder(
                            context.applicationContext,
                            AppDatabase::class.java, "infotify.db"
                        )
                        .addTypeConverter(SourceConverter::class.java)
                        .build()
                }
                return sInstance as AppDatabase
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

qia*_*nlv 13

可以通过三种方式将类型转换器添加到房间数据库中。但你应该确保只使用一种方法,否则会出错:

  1. 在类型转换器类头添加注解@ProvidedTypeConverter
  2. Room.databaseBuilder.addTypeConverter(ConverterHelper::class)
  3. 在 RoomDatabase 类头添加注释 @TypeConverters(ConverterHelper::class)


小智 7

代替

Room.databaseBuilder.addTypeConverter(ConverterHelper::class)
Run Code Online (Sandbox Code Playgroud)

用这个:

Room.databaseBuilder.addTypeConverter(ConverterHelper())
Run Code Online (Sandbox Code Playgroud)