Я работал с SQLite на андроиде, и я хотел бы добавить arraylist к столбцу в таблице и затем выбрать данные назад как arraylist. arraylist является списком Longs. Я заметил, что SQL имеет опцию для хранения БЛОБОВ, однако похоже, что я должен преобразовать arraylist в байт [] сначала перед способностью сохранить его как блоб в моей базе данных SQLite.
Если у кого-либо есть решение о том, как сохранить arraylists в базу данных SQLite, которая значительно ценилась бы. Или есть ли какая-либо другая опция для сохранения моего массива данных, я должен рассмотреть?
Вам придется сделать это вручную, просмотреть каждый элемент в списке и изменить его на байтовый перед сохранением в базе данных
for (long l : array<long>){
//change to byte here
//Store in database here
}
Пожалуйста, простите меня за жестокий плагиат моего предыдущего ответа на 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
Похоже, что вы хотите сериализовать список. Вот учебник/интро по Java Serialization API.