2010-06-29 5 views
17

Я работал с SQLite на Android, и я хотел бы добавить arraylist в столбец в таблице, а затем получить данные обратно в качестве arraylist. Аррайалист - это список Лунсов. Я заметил, что SQL имеет возможность хранить BLOBS, однако мне кажется, что мне нужно сначала преобразовать arraylist в байт [], прежде чем он сможет сохранить его как blob в моей базе данных SQLite.Сохранение ArrayList в базе данных SQLite в Android

Если у кого-то есть решение о том, как сохранить arraylists в базу данных SQLite, которая была бы весьма признательна. Или есть другой вариант для сохранения моего массива данных, я должен рассмотреть?

ответ

2

Похоже, вы хотите сериализовать Список. Here is a tutorial/intro к API Java Serialization.

+5

ссылка мертва ... – Groot

+0

ссылка идет на java.com/ – clu

1

Вам придется делать это вручную, пройти через каждый пункт в списке и изменить его байты перед сохранением в базе данных

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

Пожалуйста, простите меня за варварски плагиат моего предыдущего ответа BLOB vs. VARCHAR for storing arrays in a MySQL table. Другие ответы на них также очень уместны.

Я думаю, что подход Con может, вероятно, лучше, чем использование сериализации Java, поскольку встроенная сериализация java потребует дополнительных байтов, а приложениям, не связанным с Java, будет сложнее работать с данными.

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

} 

Примечание: Если ваши списки иногда содержат более 31 лонги (248 байт), то вам нужно использовать BLOB. Вы не можете использовать BINARY() или VARBINARY() в MySQL. Я понимаю, что вы спрашиваете о SQLite, но в духе полностью плагиатом мой предыдущий ответ, я буду делать вид, что вы спрашиваете о 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

У меня было два ArrayList<String>, как будет более 1000 записей. Я смотрел на капли и байты, но для меня решение ускорить процесс и сделать его пригодным для использования было путем изменения метода вставки и избавления от database.insert. Кредит для этого - 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(); 
     } 
    } 

Легко адаптируется к длинным и целым и т. Д. И быстро осветляется. К счастью, мне больше не пришлось почесывать голову о блобах и байтах! Надеюсь, поможет.

25

Вставка:

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

//....Add Значение для inputArray

Gson gson = new Gson(); 

String inputString= gson.toJson(inputArray); 

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

использования "inputString", чтобы сохранить значение ArrayList в базе данных SQLite

Чтобы извлечь :

Получить строку из SQLiteDatabse, которую вы сохранили и сменили на тип ArrayList li ke ниже: outputarray - это строка, которая получается из SQLiteDatabase для этого примера.

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

ArrayList<String> finalOutputString = gson.fromJson(outputarray, type); 
  • В SQLite использования текста в качестве формата для хранения строки значения .....
+1

что такое Gson? Нет возможности навязать этот класс. –

+2

@ Md.ImranChoudhury 'Gson (https://github.com/google/gson) - это библиотека для преобразования объектов Java в JSON и из JSON с использованием отражения.' – sandrstar

+1

Спасибо @sandrstar –

3

Существует более простой способ сделать это совершенно по-другому. вы можете создать строку, состоящую из всех ваших значений массива. . для этого сделать StringBuilder и добавлять значения непрерывно и offcource с сепаратором (как simbole вас, которые вы не будете использовать в своих значений массива, например виртуальный «|» в коде, например:

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

, когда вы хотите получить их и использовать значения. Получите столбец из базы данных, чистый для String, и с помощью splite() opration очистите все значения массива в столбце массива, чем вы можете легко его использовать :)

позволяет сделать это с кодом:

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

с простым конвертированием вы можете использовать их как двойные;

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

может быть, это не стандарт, но это полезно, надежда помощь;)

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]); 
Смежные вопросы