首页 > 解决方案 > 如何修复 Android Room (Kotlin) 中的 TypeConverter 类

问题描述

我正在使用 Android Room,但遇到了问题。我创建了一个TypeConverter类(在我的例子中是ConverterHelper),添加了注释 @ProvidedTypeConverter、@TypeConverter 和 @TypeConverters(ConverterHelper::class) 但我收到以下错误:

java.lang.IllegalArgumentException: Unexpected type converter class com.example.mas_implementation_kotlin.helper.ConverterHelper. Annotate TypeConverter class with @ProvidedTypeConverter annotation or remove this converter from the builder.

这是我的ConverterHelper

@ProvidedTypeConverter
class ConverterHelper {

   @TypeConverter
   fun stringToListOfStrings(value: String): ArrayList<String> {
       val listType: Type = object : TypeToken<ArrayList<String?>?>() {}.type
       return Gson().fromJson(value, listType)
   }

   @TypeConverter
   fun listOfStringsToString(list: List<String>): String {
       val gson = Gson()
       return gson.toJson(list)
   }

   @TypeConverter
   fun listOfVisitsToString(listOfVisits: List<Visit>): String {
       return Gson().toJson(listOfVisits).toString()
   }

   @TypeConverter
   fun stringToListOfVisits(value: String): List<Visit> {
       val listOfVisits = object : TypeToken<ArrayList<Visit>>() {}.type
       return Gson().fromJson(value, listOfVisits)
   }  
}

数据库:

@Database(
   entities = [
       Consultant::class,
       Doctor::class,
       Person::class,
       Place::class,
       PreparationToTest::class,
       Receptionist::class,
       Referral::class,
       Survey::class,
       Technician::class,
       Test::class,
       TestResult::class,
       Visit::class
   ], version = 1
)  
@TypeConverters(ConverterHelper::class)
abstract class AppDatabase : RoomDatabase() {
   public abstract fun entitiesDao(): EntitiesDao
}

我的实体:

@Entity
@TypeConverters
data class Visit(
   @PrimaryKey val id: String,
   @ColumnInfo(name = "visitDate") val visitDate: String,
   @ColumnInfo(name = "visitPlaceId") val visitPlaceId: String,
   @ColumnInfo(name = "defrayalOfExpenses") val defrayalOfExpenses: String,
   @ColumnInfo(name = "additionalInfo") val additionalInfo: String,
   @ColumnInfo(name = "personId") val personId: String,
   @ColumnInfo(name = "consultantId") val consultantId: String,
   @ColumnInfo(name = "receptionistId") val receptionistId: String,
   @ColumnInfo(name = "referralId") val referralId: String,
   @ColumnInfo(name = "visitsStatus") val visitStatus: String,
   @ColumnInfo(name = "testId") val testId: String
)

这就是我在方法中创建 Db 的onCreate方式:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)
    setUI()
    database = Room.databaseBuilder(
        this,
        AppDatabase::class.java,
        "database"
    )
        .addTypeConverter(ConverterHelper::class)
        .fallbackToDestructiveMigration()
        .build()
    fetchDataFromDatabase()
    fetchListOfBookedVisitsFromDb()
}

这就是我从数据库中获取数据的方式:

private fun fetchDataFromDatabase() {
    val visitAdapter = VisitAdapter(baseContext, this::onClickAction)
    lifecycleScope.launch(Dispatchers.IO) {
        val entitiesDao = database.entitiesDao()
        databaseHelper = DatabaseHelper(entitiesDao)
        visitAdapter.setAdapterList(databaseHelper.getPersonVisitModelList())
        withContext(Dispatchers.Main) {
            binding.mainNewVisitListRecyclerView.apply {
                adapter = visitAdapter
                layoutManager = LinearLayoutManager(this@MainActivity)
            }
        }
    }
}

我的DatabaseHelper班级有方法:

fun getPersonVisitModelList(): List<VisitModel> {
    val visitModelList = mutableListOf<VisitModel>()
    val personVisitsString = entitiesDao.getAllPatientVisits()
    val converterHelper = ConverterHelper()
    val personVisitsList = converterHelper.stringToListOfVisits(personVisitsString)
    for (visit in personVisitsList) {
        visitModelList.add(
            VisitModel(
                visit.id,
                getTestTypeByTestId(visit.testId),
                getTestPlaceByPlaceId(visit.visitPlaceId),
                visit.visitDate
            )
        )
    }
    return visitModelList
}

你知道如何解决这个错误吗?我尝试了注释getPersonVisitModelList方法,因为我不确定是否可以创建和使用ConverterHelper该类的实例,但错误仍然存​​在。

标签: androidkotlinandroid-roomtypeconverter

解决方案


推荐阅读