Сохранение ArrayList в базе данных SQLite в Android - PullRequest
18 голосов
/ 29 июня 2010

Я работал с SQLite на Android, и я хотел бы добавить массив списков в столбец таблицы, а затем получить данные обратно как массив списков.Arraylist представляет собой список Longs.Я заметил, что в SQL есть опция для хранения BLOBS, однако, похоже, мне нужно сначала преобразовать массив в байт [], прежде чем я смогу сохранить его как BLOB-объект в моей базе данных SQLite.

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

Ответы [ 7 ]

26 голосов
/ 09 октября 2014

Для вставки:

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

// .... Добавить значения в inputArray

Gson gson = new Gson();

String inputString= gson.toJson(inputArray);

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

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

Для получения:

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

В SQLite используйте текст в качестве формата для хранения строки Value .....
7 голосов
/ 29 июня 2010

Пожалуйста, прости меня за дикий плагиат моего предыдущего ответа на BLOB против VARCHAR для хранения массивов в таблице MySQL . Другие ответы там тоже очень уместны.

Я думаю, что подход Кона, вероятно, лучше, чем использование 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 голосов
/ 31 октября 2012

У меня было два ArrayList<String>, оба будут 1000+ записей. Я посмотрел на двоичные объекты и байты, но для меня решение ускорить процесс и сделать его пригодным для использования было путем изменения метода вставки и избавления от database.insert - Кредит на это здесь .

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

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

4 голосов
/ 13 января 2016

Есть более простой способ сделать это совершенно другим способом.Вы можете сделать строку, которая состоит из всех ваших значений массива.для этого создайте StringBuilder и добавляйте значения непрерывно и извлекайте их с помощью разделителя (например, символа, который вы не будете использовать в значениях массива. Например, виртуальный '|'. В коде, например:

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 () очистите каждое значение массива в столбце массива, чем вы можете легко его использовать:)

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

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

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

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

возможно, это не стандартно, но полезно, надеюсь, поможет;)

2 голосов
/ 29 июня 2010

Похоже, вы хотите сериализовать список. Вот учебное пособие / введение в API сериализации Java.

1 голос
/ 29 июня 2010

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

for (long l : array<long>){
//change to byte here
//Store in database here
}
0 голосов
/ 26 августа 2017
    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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...