【发布时间】:2021-05-23 14:27:55
【问题描述】:
java.lang.IllegalArgumentException:数据库配置中缺少 ArticlesDao 所需的类型转换器(SourceConverter 类)。
我在编译(运行时)我的应用程序时发生崩溃,因为根据显示的错误,我的数据库配置中缺少转换器。我怎么能解决这个问题?我需要帮助。
源码如下:
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)
}
ArticleEntity.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
)
ArticlesDao.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
}
AppDatabase.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
}
}
}
【问题讨论】:
-
我没有尝试过
@ProvidedTypeConverter。如果您删除该注释并删除addTypeConverter(),它是否有效? -
它工作正常!感谢您的帮助!
标签: android kotlin android-room typeconverter