Как заставить typeconverter работать со списком пользовательского класса, который содержит список?

#android #kotlin #android-room #detection #typeconverter

#Android #kotlin #android-комната #обнаружение #typeconverter

Вопрос:

Класс сущности. Я хочу извлекать элементы, поскольку детектор камеры обнаруживает объекты. Какой тип typeconverter будет принимать список элементов class, confidence и т. Д.?

 @Entity(tableName = "Objects_table")
data class Objects(
        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "object_id")
        var id: Int,
        @ColumnInfo(name = "object_name")
        var name: DetectionResult?,
        @ColumnInfo(name = "detected_time")
        var time: Result?)
  

Класс результатов, который я хочу получить

 data class Result(
        val id: Int,
        val title: String,
        val confidence: Float,
        val location: RectF
) {
    val text: String by lazy {
        "$id:$title[${"%.2f".format(confidence)}]"
    }
} 
  

Класс ViewModel:

 class ObjectViewModel(private val repository: ObjectRepository) : ViewModel(), Observable {

    val objects = repository.objects
    private var objectDetected: ObjectDetectorAnalyzer? = null

    fun saver(){
        val name = objectDetected?.nobjects?.get(0)
        val conf = objectDetected?.nobjects?.get(1)

    }
  

Класс, из которого я ссылаюсь на список объектов, которые постоянно меняются:

 class ObjectDetectorAnalyzer(
        private val context: Context,
        private val config: Config,
        private val onDetectionResult: (Result) -> Unit
): ImageAnalysis.Analyzer {

    private var inputArray = IntArray(config.inputSize * config.inputSize)

    val nobjects = detect(inputArray)
     
    private fun detect(inputArray: IntArray): List<DetectionResult> {
        var detector = objectDetector
        if (detector == null) {
            detector = ObjectDetector(
                    assetManager = context.assets,
                    isModelQuantized = config.isQuantized,
                    inputSize = config.inputSize,
                    labelFilename = config.labelsFile,
                    modelFilename = config.modelFile,
                    numDetections = config.numDetection,
                    minimumConfidence = config.minimumConfidence,
                    numThreads = 1,
                    useNnapi = false
            )
            objectDetector = detector
        }

        return detector.detect(inputArray)
    }
}
  

Заранее спасибо!!

Ответ №1:

Этот пример может вам помочь. У меня есть один объект Animal и его список пород

 @Entity(tableName = "Animal")
public class Animal {

    @PrimaryKey(autoGenerate = true)
    private long pid;
    
    @TypeConverters(BreedConverter.class)
    @ColumnInfo(name = "breed")
    private ArrayList<Breed> breedArrayList;    
}
  

У меня есть аннотация с @TypeConverters, указывающая на BreedConverter.class

 class BreedConverter {
    @TypeConverter
    fun toBreedList(data: String): ArrayList<Breed> {
        val listType = object : TypeToken<ArrayList<Breed>>() {}.type
        return GsonBuilder().create().fromJson(data, listType)
    }

    @TypeConverter
    fun toBreedString(breed:  ArrayList<Breed>): String {
        return GsonBuilder().create().toJson(breed)
    }
}
  

В моем случае он работает нормально. Вы можете попробовать этот способ. TypeConverter преобразует список в строку при сохранении и преобразует обратно в список из строки, когда вы обращаетесь к этому объекту с помощью геттеров.