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

Я работал с SQLite на андроиде, и я хотел бы добавить arraylist к столбцу в таблице и затем выбрать данные назад как arraylist. arraylist является списком Longs. Я заметил, что SQL имеет опцию для хранения БЛОБОВ, однако похоже, что я должен преобразовать arraylist в байт [] сначала перед способностью сохранить его как блоб в моей базе данных SQLite.

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

18
задан Mango 29 June 2010 в 15:39
поделиться

3 ответа

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

for (long l : array<long>){
//change to byte here
//Store in database here
}
1
ответ дан 30 November 2019 в 06:35
поделиться

Пожалуйста, простите меня за жестокий плагиат моего предыдущего ответа на BLOB vs. 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 long (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
ответ дан 30 November 2019 в 06:35
поделиться

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

2
ответ дан 30 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: