Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Вставить:

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.....

Ответ 2

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

Я думаю, что подход 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

Ответ 3

У меня было два ArrayList<String>, у обоих будет 1000+ записей. Я посмотрел на blobs и байты, но для меня решение ускорить процесс и сделать его пригодным для использования было путем изменения метода вставки и избавления от 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

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

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;

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

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

Ответ 6

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

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

Ответ 7

    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]);