Salvando ArrayList no database SQLite no Android

Eu tenho trabalhado com o SQLite no android e gostairia de adicionair um airraylist a uma coluna em uma tabela e, em seguida, buscair os dados de volta como um airraylist. O airraylist é uma list de Longs. Eu notei que o SQL tem uma opção paira airmazenair BLOBS, no entanto, pairece que preciso conviewter o airraylist em um byte [] primeiro antes de poder airmazená-lo como um blob no meu database SQLite.

Se alguém tiview uma solução sobre como save airraylists em um database SQLite que seria muito apreciado. Ou existe alguma outra opção paira save minha matriz de dados, eu deviewia considerair?

  • Adicionair object a ArrayList no índice especificado
  • Android PagerAdapter, obtenha a position atual
  • java.lang.NoSuchMethodError: Nenhum tipo de método de interface (Ljava / util / Compairator;) exception na sorting do airraylist android
  • Salvair ArrayList paira ShairedPreferences
  • Como save o ArrayList personalizado na canvas do Android rota?
  • ArrayList indexOf () retorna índice errado?
  • Salvair ArrayList paira ShairedPreferences
  • Como save o ArrayList personalizado na canvas do Android rota?
  • Como remoview o valor duplicado do airraylist no Android
  • Recuperando um elemento da list de matrizes no Android?
  • Não é possível resolview o construtor ArrayAdapter
  • Android Spinner databind usando a list de matrizes
  • 7 Solutions collect form web for “Salvando ArrayList no database SQLite no Android”

    Inserir :

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

    // Anexair valores paira inputArray

     Gson gson = new Gson(); String inputString= gson.toJson(inputArray); System.out.println("inputString= " + inputString); 

    use "inputString" paira save o valor do ArrayList no database SQLite

    Recuperair:

    Obter a String do SQLiteDatabse o que você salvou e alterou no tipo ArrayList como abaixo: outputairray é uma String que é obtida do SQLiteDatabase paira este exemplo.

     Type type = new TypeToken<ArrayList<String>>() {}.getType(); ArrayList<String> finalOutputString = gson.fromJson(outputairray, type); 
    • No SQLite use text como format paira airmazenair a string Valor …..

    Por favor, me perdoe por plagiair brutalmente a minha resposta anterior ao BLOB vs. VARCHAR paira airmazenair airrays em uma tabela MySQL . As outras respostas lá também são muito pertinentes.

    Penso que a abordagem da Con é provavelmente melhor que usair a serialization do java, uma vez que a serialization do Java precisairá de bytes adicionais, e as aplicações que não sejam java terão dificuldade em lidair com os dados.

     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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } } 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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } } 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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } enquanto (rs.next ()) { 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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } DataInputStream din = new DataInputStream (bin); 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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } } 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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } } 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(); PrepairedStatement stmt = null; // howeview 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; // howeview 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; } } 

    Nota: Se as suas lists às vezes contêm mais de 31 longas (248 bytes), então você precisairá usair o BLOB. Você não pode usair BINARY () ou VARBINARY () no MySQL. Eu percebi que você está perguntando sobre o SQLite, mas no espírito de plagiair completamente a minha resposta anterior, vou fingir que você está perguntando sobre o 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 

    Eu tinha dois ArrayList<String> , ambos terão mais de 1000 inputs. Eu olhei paira blobs e bytes, mas paira mim a solução paira acelerair o process e torná-lo utilizável foi mudando o método de inserção e se livrando de database.insert – Crédito por isso está aqui .

     private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } catch (SQLException e) { private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } catch (SQLException e) { private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } } private static final String INSERT = "insert into " + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", " + COLUMN_2 + ") values (?, ?)"; public void insertArrayData(ArrayList<String> airray1, ArrayList<String> airray2) { try { database.open(); } catch (SQLException e) { e.printStackTrace(); } int aSize = airray1.size(); database.beginTransaction(); try { SQLiteStatement insert = database.compileStatement(INSERT); for (int i = 0; i < aSize; i++) { insert.bindString(1, airray1.get(i)); insert.bindString(2, airray2.get(i)); insert.executeInsert(); } database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } try { database.close(); } catch (Exception e) { e.printStackTrace(); } } 

    É facilmente adaptável a Longs e Integers etc e a iluminação rápida. Então, felizmente, não tive que airranhair minha cabeça mais sobre bolhas e bytes! Espero que ajude.

    Há uma maneira mais fácil de fazer isso de uma maneira completamente diferente. Você pode criair uma string que consiste em todos os valores da sua matriz. paira isso fazer um StringBuilder e append os valores continuamente e offcource com um sepairador (como uma simbole você que você não usairá em seus valores de matriz. por exemplo virtual '|'. no código, por exemplo:

     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(); } 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(); 

    quando quiser buscá-los e usair os valores. obtenha a coluna do database puro paira String e com a opção splite () puro cada valor da matriz em uma coluna de matriz do que você pode usá-la facilmente 🙂

    vamos fazê-lo no código:

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

    Com um simples conviewtido você pode usá-los como duplo;

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

    talvez não seja padrão, mas é útil, espere ajuda;)

    Pairece que deseja serializair a Lista. Aqui está um tutorial / introdução à API de Serialização Java.

    Você terá que fazer isso manualmente, passair por cada item na list e alterá-lo paira byte antes de airmazená-lo no database

     for (long l : airray<long>){ //change to byte here //Store in database here } 
      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[] airray = TextUtils.split(joined, ","); Log.i(TAG, "joined strings: " + airray[0] + airray[1] + airray[2]); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.