Skip to content

Commit bc8d4cc

Browse files
committed
rewrote csv export for automatic detection of the database
1 parent 8096bc1 commit bc8d4cc

1 file changed

Lines changed: 33 additions & 11 deletions

File tree

app/src/main/java/com/mouton/openwinemer/util/CsvExporter.kt

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,48 @@ import java.io.File
77

88
object CsvExporter {
99

10-
// Cette fonction crée un fichier CSV dans le stockage interne de l’app.
10+
// Récupère les propriétés dans l'ordre EXACT de déclaration dans la data class
11+
private fun orderedFields(clazz: Class<*>): List<java.lang.reflect.Field> {
12+
return clazz.declaredFields
13+
.filter { !it.name.contains("$") } // ignore les champs internes Kotlin
14+
}
15+
16+
// Génère l'en-tête CSV automatiquement
17+
private fun csvHeader(clazz: Class<*>): String {
18+
return orderedFields(clazz)
19+
.joinToString(";") { it.name }
20+
}
21+
22+
// Génère une ligne CSV pour un objet
23+
private fun csvLine(obj: Any): String {
24+
val clazz = obj::class.java
25+
return orderedFields(clazz)
26+
.joinToString(";") { field ->
27+
field.isAccessible = true
28+
val value = field.get(obj)
29+
value?.toString() ?: ""
30+
}
31+
}
32+
1133
fun exportToCsv(
1234
context: Context,
1335
wines: List<WineEntity>,
1436
fileName: String = "openwinemer_export.csv"
1537
): File {
38+
1639
val file = File(context.filesDir, fileName)
40+
1741
file.bufferedWriter().use { out ->
18-
// Ligne d’en-tête (noms des colonnes).
19-
out.write(
20-
"id;name;producer;cuvee;vintage;wineType;color;country;region;stockQuantity\n"
21-
)
22-
wines.forEach { w ->
23-
out.write(
24-
"${w.id};${w.name ?: ""};${w.producer ?: ""};${w.cuvee ?: ""};" +
25-
"${w.vintage ?: ""};${w.wineType ?: ""};${w.color ?: ""};" +
26-
"${w.country ?: ""};${w.region ?: ""};${w.stockQuantity ?: ""}\n"
27-
)
42+
43+
// 1) Écrire l'en-tête automatiquement
44+
out.write(csvHeader(WineEntity::class.java) + "\n")
45+
46+
// 2) Écrire chaque ligne automatiquement
47+
wines.forEach { wine ->
48+
out.write(csvLine(wine) + "\n")
2849
}
2950
}
51+
3052
return file
3153
}
3254
}

0 commit comments

Comments
 (0)