web-dev-qa-db-fra.com

Enregistrement de ArrayList dans la base de données SQLite sous Android

J'ai travaillé avec SQLite sur Android et je voudrais ajouter un arraylist à une colonne dans une table, puis récupérer les données en tant qu'arraylist. L'aryliste est une liste de Longs. J'ai remarqué que SQL a une option pour stocker les BLOBS, mais il semble que j'ai besoin de convertir l'arraylist en octet [] avant de pouvoir le stocker en tant que blob dans ma base de données SQLite.

Si quelqu'un a une solution sur la façon de sauvegarder des répertoires dans une base de données SQLite, ce serait grandement apprécié. Ou y at-il une autre option pour sauvegarder mon tableau de données, je devrais envisager?

18
Mango

Insérer :

ArrayList<String> inputArray=new ArrayList<String>();

//....Add Values ​​to inputArray

Gson gson = new Gson();

String inputString= gson.toJson(inputArray);

System.out.println("inputString= " + inputString);

utilisez "inputString" pour enregistrer la valeur de ArrayList dans la base de données SQLite 

Retrouver:

Obtenez la chaîne de la SQLiteDatabse ce que vous avez enregistré et changé en type ArrayList comme ci-dessous: Outputarray est une chaîne extraite de SQLiteDatabase pour cet exemple.

Type type = new TypeToken<ArrayList<String>>() {}.getType();

ArrayList<String> finalOutputString = gson.fromJson(outputarray, type);
  • Dans SQLite, utilisez le texte comme format pour stocker la chaîne Valeur .....
26
Ashok

Pardonnez-moi s'il vous plaît d'avoir plagié sauvagement ma réponse précédente à BLOB vs. VARCHAR pour le stockage de tableaux dans une table MySQL . Les autres réponses là-bas sont également très pertinentes.

Je pense que l'approche de Con est probablement préférable à la sérialisation Java, car celle-ci nécessitera des octets supplémentaires et que les applications non Java auront plus de mal à traiter les données.

public static void storeInDB(ArrayList<Long> longs) throws IOException, SQLException {

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    DataOutputStream dout = new DataOutputStream(bout);
    for (long l : longs) {
        dout.writeLong(l);
    }
    dout.close();
    byte[] asBytes = bout.toByteArray();

    PreparedStatement stmt = null;  // however you get this...
    stmt.setBytes(1, asBytes);
    stmt.executeUpdate();
    stmt.close();
}

public static ArrayList<Long> readFromDB() throws IOException, SQLException {

    ArrayList<Long> longs = new ArrayList<Long>();
    ResultSet rs = null;  // however you get this...
    while (rs.next()) {
        byte[] asBytes = rs.getBytes("myLongs");
        ByteArrayInputStream bin = new ByteArrayInputStream(asBytes);
        DataInputStream din = new DataInputStream(bin);
        for (int i = 0; i < asBytes.length/8; i++) {
            longs.add(din.readLong());
        }
        return longs;
    }

}

Remarque: si vos listes contiennent parfois plus de 31 longs (248 octets), vous devrez utiliser BLOB. Vous ne pouvez pas utiliser BINARY () ou VARBINARY () dans MySQL. Je comprends que vous posez des questions sur SQLite, mais dans l’esprit de plagier complètement ma réponse précédente, je vais faire semblant que vous posez des questions sur MySQL:

mysql> CREATE TABLE t (a VARBINARY(2400)) ;
ERROR 1074 (42000): Column length too big for column 'a' (max = 255);
use BLOB or TEXT instead
7
Julius Musseau

J'ai eu deux ArrayList<String>, les deux volonté 1000+ entrées. J'ai examiné les blobs et les octets, mais pour moi, la solution pour accélérer le processus et le rendre utilisable était de changer la méthode d'insertion et de se débarrasser de database.insert - Le crédit pour cela est ici .

private static final String INSERT = "insert into "
            + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", "
            + COLUMN_2 + ") values (?, ?)";

public void insertArrayData(ArrayList<String> array1,
            ArrayList<String> array2) {

        try {
            database.open();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        int aSize = array1.size();

        database.beginTransaction();

        try {
            SQLiteStatement insert = database.compileStatement(INSERT);

            for (int i = 0; i < aSize; i++) {

                insert.bindString(1, array1.get(i));
                insert.bindString(2, array2.get(i));
                insert.executeInsert();

            }

            database.setTransactionSuccessful();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            database.endTransaction();
        }

        try {
            database.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Il est facilement adaptable aux longueurs et aux nombres entiers, etc. Heureusement, je n'ai plus eu à me gratter la tête à propos des blobs et des octets! J'espère que ça aide. 

6
brandall

Il existe un moyen plus simple de faire une telle chose d’une toute autre manière. Vous pouvez créer une chaîne composée de toutes vos valeurs de tableau. Pour cela, créez un StringBuilder, ajoutez les valeurs de manière continue et offcource avec un séparateur (comme un simple script que vous n'utiliserez pas dans les valeurs de votre tableau. Par exemple, virtual '|'. dans le code, par exemple:

double[] mylist = new double[]{23, 554, 55};
    StringBuilder str = null;
    str = new StringBuilder();

    for(int i=0;i<mylist.length;i++){
        str.append(mylist[i]+"|");
    }

    String result = str.toString();

    db.open();
    db.insert(result);
    db.close();

quand vous voulez les récupérer et utiliser les valeurs. obtenez la colonne de la base de données pure it en String et avec l'opration splite () pure chaque valeur de tableau dans une colonne de tableau que vous pouvez facilement utiliser :)

permet de le faire dans le code:

String str = db.getdata();
    String[] list = str.split("|");

avec un simple converti, vous pouvez les utiliser en double;

double mydouble = Double.parsDouble(list[1].toString());

peut-être que ce n'est pas standard mais que c'est utile, espérons l'aide;)

4
Mohammad Hadi

On dirait que vous voulez sérialiser la liste. Voici un tutoriel/intro à l'API de sérialisation Java.

2
matt b

Vous devrez le faire manuellement, parcourir chaque élément de la liste et le convertir en octet avant de le stocker dans la base de données.

for (long l : array<long>){
//change to byte here
//Store in database here
}
1
Con
    ArrayList<String> list = new ArrayList<String>();
                    list.add("Item 1");
                    list.add("Item 2");
                    list.add("Item 3");

                    String joined = TextUtils.join(",", list);
                    Log.i(TAG, "joined strings: " + joined);

                    String[] array = TextUtils.split(joined, ",");
                    Log.i(TAG, "joined strings: " + array[0] + array[1] + array[2]);
0
JamisonMan111