2010-06-29 7 views
17

Je travaille avec SQLite sur android et je voudrais ajouter un arraylist à une colonne dans une table, puis récupérer les données en arrière comme arraylist. L'arraylist est une liste de Longs. Je l'ai remarqué que SQL a une option pour le stockage BLOBS, mais il semble que je dois convertir le arraylist à un octet [] avant de pouvoir l'enregistrer comme blob dans ma base de données SQLite.Saving ArrayList dans la base de données SQLite dans Android

Si quelqu'un a une solution sur la façon de sauver ArrayLists dans une base de données SQLite qui serait grandement appréciée. Ou y at-il une autre option pour enregistrer mon tableau de données, je devrais envisager?

Répondre

1

Vous devrez le faire manuellement, passer par chaque élément dans la liste et le modifier à l'octet avant de les stocker dans la base de données

for (long l : array<long>){ 
//change to byte here 
//Store in database here 
} 
7

S'il vous plaît pardonnez-moi pour plagier férocement ma précédente réponse à BLOB vs. VARCHAR for storing arrays in a MySQL table. Les autres réponses là-bas sont aussi très pertinentes.

Je pense que l'approche de Con est probablement meilleure que l'utilisation de la sérialisation java car la sérialisation interne de java nécessitera des octets supplémentaires, et 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 positions longues (248 octets), alors vous aurez besoin d'utiliser blob. Vous ne pouvez pas utiliser BINARY() ou VARBINARY() dans MySQL. Je sais que vous vous demandez au sujet SQLite, mais dans l'esprit de plagier complètement ma réponse précédente, je vais prétendre que vous poser 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 
6

J'avais deux ArrayList<String>, tous les deux entrées 1000+. J'ai regardé des blobs et des octets, mais pour moi la solution pour accélérer le processus et le rendre utilisable était en changeant la méthode d'insertion et en se débarrassant de database.insert - Crédit pour ceci est here.

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 à et désire ardemment Entiers etc et éclaircissement rapide. Alors, heureusement, je n'ai plus eu à me gratter la tête à propos des blobs et des octets! J'espère que cela aide.

25

Pour insérer:

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

Valeurs //....Add à inputArray

Gson gson = new Gson(); 

String inputString= gson.toJson(inputArray); 

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

utilisation "inputString" pour sauvegarder la valeur de ArrayList dans SQLite Database

Pour retreive :

Récupère la chaîne de SQLiteDatabse que vous avez enregistrée et modifiée dans ArrayList tapez comme ci-dessous: outputarray est une chaîne qui provient de SQLiteDatabase pour cet exemple.

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

ArrayList<String> finalOutputString = gson.fromJson(outputarray, type); 
  • Dans SQLite texte utilisé en tant que format pour stocker la chaîne de valeur .....
+1

ce qui est Gson? Il n'y a pas d'option pour imposer cette classe. –

+2

@ Md.ImranChoudhury 'Gson (https://github.com/google/gson) est une bibliothèque permettant de convertir des objets Java vers et depuis JSON en utilisant la réflexion.' – sandrstar

+1

Merci @sandrstar –

3

Il existe un moyen plus simple de faire une chose complètement différente. vous pouvez créer une chaîne composée de toutes vos valeurs de tableau. . pour ce faire un StringBuilder et ajoutez les valeurs en continu et offcource avec un séparateur (comme un simbole vous que vous ne serez pas utiliser dans vos valeurs de tableau par exemple virtuel « | » 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. obtenir la colonne de base de données pur à cordes et avec l'opration splite() pur chacune des valeurs de tableau dans une colonne de la matrice que u peut facilement l'utiliser :)

permet de le faire dans le code:

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

avec une conversion simple, vous pouvez les utiliser comme double;

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

est peut-être pas standard mais il est serviable, l'espoir de l'aide;)

0
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]); 
lien
Questions connexes