French Les Map me font peur :(

Serge Bertet

Active Member
Licensed User
Salut,
je stocke des données (paires clefs/valeurs) dans des Maps mais il est précisé que ces structures de données ne conservent pas l'ordre de stockage.
Déjà je ne vois pas dans quel cas l'ordre serait perdu (fragmentation de la mémoire ?).
Mes Map ne contiennent que quelques centaines de clefs/valeurs (200, 300 ?), je ne pense pas que ça arrive souvent.
Est-ce qu'il existe d'autres types de données par paire ?
J'ai bien pensé créer une liste de type personnalisé et stocker ça avec RandomAccessFile mais je trouve que ça fait lourd pour si peu.
Il reste KeyValueStore aussi, et créer un fichier BDD à chaque fois ?... Possible ?
Merci.
 

zed

Active Member
Licensed User
Tu peux simplement stocker tes données dans une DB SQLite. C'est très rapide et tu fais ce que tu veux avec.
 

Grinaute

Member
Licensed User
Longtime User
Salut Serge,

voici un exemple vite fait et non testé :

B4X:
Sub Process_Globals
    Dim SQL1 As SQL
End Sub

Sub Globals
    Private EditTextKey As EditText
    Private EditTextValue As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        InitializeDatabase
    End If
   
    ' Créer l'interface utilisateur ici
End Sub

Sub InitializeDatabase
    If File.Exists(File.DirInternal, "mapdata.db") = False Then
        SQL1.Initialize(File.DirInternal, "mapdata.db", True)
        CreateTable
    Else
        SQL1.Initialize(File.DirInternal, "mapdata.db", False)
    End If
End Sub

Sub CreateTable
    SQL1.ExecNonQuery("CREATE TABLE IF NOT EXISTS MapData (id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT UNIQUE, value TEXT)")
End Sub

Sub AddEntry
    Dim key As String = EditTextKey.Text
    Dim value As String = EditTextValue.Text
   
    SQL1.ExecNonQuery2("INSERT OR REPLACE INTO MapData (key, value) VALUES (?, ?)", Array As String(key, value))
    ToastMessageShow("Entrée ajoutée/mise à jour avec succès", False)
End Sub

Sub UpdateEntry
    Dim key As String = EditTextKey.Text
    Dim value As String = EditTextValue.Text
   
    SQL1.ExecNonQuery2("UPDATE MapData SET value = ? WHERE key = ?", Array As String(value, key))
    ToastMessageShow("Entrée mise à jour avec succès", False)
End Sub

Sub DeleteEntry
    Dim key As String = EditTextKey.Text
   
    SQL1.ExecNonQuery2("DELETE FROM MapData WHERE key = ?", Array As String(key))
    ToastMessageShow("Entrée supprimée avec succès", False)
End Sub

Sub RetrieveEntry
    Dim key As String = EditTextKey.Text
    Dim cursor As Cursor
   
    cursor = SQL1.ExecQuery2("SELECT value FROM MapData WHERE key = ?", Array As String(key))
    If cursor.RowCount > 0 Then
        cursor.Position = 0
        EditTextValue.Text = cursor.GetString("value")
    Else
        EditTextValue.Text = ""
        ToastMessageShow("Clé non trouvée", False)
    End If
    cursor.Close
End Sub
 

Serge Bertet

Active Member
Licensed User
Oui, merci à vous, je pensais à quelque chose de moins lourd vu que c'est pour stocker sur carte SD que les utilisateurs pourraient se passer.
Je fais le test avec KeyValueStore pour l'instant.
J'aurais aimé un format texte, plus facile à interpréter au cas où ....
 
Top