Android - persistencia de datos a fichero Json en android con jetpack compose (kotlin)

 
Vista:
sin imagen de perfil

persistencia de datos a fichero Json en android con jetpack compose (kotlin)

Publicado por Kid (1 intervención) el 18/09/2023 08:44:15
Muy buenas.
Estoy tratando de implementar persistencia en mi proyecto android (jetpack compose, kotlin); en principio no debería tener demasiada complejidad, trabajo con dos arraylist de strings: uno almacena preguntas y otro respuestas.
El primer problema lo tuve al tratar de guardar el fichero en una ruta específica, donde me salía un error que no conservo, que decía algo como que no se podía escribir en el disco, que era de sólo lectura (da igual en qué ubicación local escogiese). Finalmente he modificado los métodos de importar y exportar y ya no me genera ningún error, pero no accede satisfactoriamente a los datos.
Adjunto el código; muchas gracias:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
val pathToResources = "src/main/java/com/example/myapplication/resources"
 
fun exportQuestionsAndAnswersToJson(context: Context, questions: List<String>, answers: List<String>) {
        val gson = GsonBuilder().setPrettyPrinting().create()
 
        val qaList = mutableListOf<QA>()
 
        // Crear una lista de objetos QA a partir de las listas de preguntas y respuestas
        for (i in 0 until questions.size.coerceAtMost(answers.size)) {
            val pregunta = questions[i]
            val respuesta = answers[i]
            qaList.add(QA(pregunta, respuesta))
        }
 
        // Crear un JSON a partir de la lista de QA
        val json = gson.toJson(qaList)
 
        try {
            val fileName = "questions_and_answers.json"
 
            // Obtener el directorio de archivos privado de la aplicación
            //val directory = context.filesDir
            val directory = pathToResources
 
            // Crear un archivo en el directorio de archivos privado
            val outputFile = File(directory, fileName)
 
            // Escribir el JSON en el archivo
            val fileOutputStream = FileOutputStream(outputFile)
            fileOutputStream.write(json.toByteArray())
            fileOutputStream.close()
 
            println("Las preguntas y respuestas se han guardado en el archivo JSON en el directorio de archivos privados.")
            Toast.makeText(context, "Las preguntas y respuestas se han guardado en el archivo JSON en el directorio de archivos privados.", Toast.LENGTH_SHORT).show();
        } catch (e: IOException) {
            e.printStackTrace()
            println("ERROR: Las preguntas y respuestas NO se han guardado en el archivo JSON.")
            Toast.makeText(context, "ERROR: Las preguntas y respuestas NO se han guardado en el archivo JSON.", Toast.LENGTH_SHORT).show();
        }
    }
 
 
    fun importQuestionsAndAnswersFromJson(context: Context, vm: JuliViewModel): Boolean {
        val fileName = "questions_and_answers.json"
        //val file = File(context.filesDir, fileName)
        val file = File(pathToResources, fileName)
 
        if (!file.exists()) {
            // El archivo JSON no existe en el directorio
            println("El archivo JSON no existe en el directorio.")
            Toast.makeText(context, "El archivo JSON no existe en el directorio.", Toast.LENGTH_SHORT).show();
            return false
        }
 
        try {
            val json = file.readText()
            val gson = Gson()
            val qaListType = object : TypeToken<List<QA>>() {}.type
 
            val qaList: List<QA> = gson.fromJson(json, qaListType)
 
            val questions = mutableListOf<String>()
            val answers = mutableListOf<String>()
 
            for (qa in qaList) {
                questions.add(qa.pregunta)
                answers.add(qa.respuesta)
            }
 
            // Agregar preguntas a vm.listOfQuestions
            vm.listOfQuestions.addAll(questions)
 
            // Agregar respuestas a vm.listOfAnswers
            vm.listOfAnswers.addAll(answers)
 
            return true
        } catch (e: IOException) {
            e.printStackTrace()
            println("ERROR: No se pudo leer el archivo JSON.")
            Toast.makeText(context, "ERROR: No se pudo leer el archivo JSON.", Toast.LENGTH_SHORT).show();
            return false
        }
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder