it-swarm.com.ru

Сохранение ArrayList в базе данных SQLite в Android

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

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

18
Mango

Вставить :

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 для этого примера.

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

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

Пожалуйста, прости меня за яростный плагиат моего предыдущего ответа на 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
7
Julius Musseau

У меня было два 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();
        }
    }

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

6
brandall

Есть более простой способ сделать это совершенно другим способом .. Вы можете создать строку, которая состоит из всех ваших значений массива .. Для этого создайте 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;

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

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

4
Mohammad Hadi

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

2
matt b

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

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