在 Android 的 SQLite 数据库中保存 ArrayList
我一直在Android上使用SQLite,我想将数组列表添加到表中的列中,然后将数据作为数组列表取回。数组列表是 Long 的列表。我注意到SQL有一个存储BLOBS的选项,但是看起来我需要先将数组列表转换为byte[],然后才能将其作为blob存储在我的SQLite数据库中。
如果有人有一个如何将数组列表保存到SQLite数据库中的解决方案,那将不胜感激。或者有任何其他选项来保存我的数据数组,我应该考虑?
我一直在Android上使用SQLite,我想将数组列表添加到表中的列中,然后将数据作为数组列表取回。数组列表是 Long 的列表。我注意到SQL有一个存储BLOBS的选项,但是看起来我需要先将数组列表转换为byte[],然后才能将其作为blob存储在我的SQLite数据库中。
如果有人有一个如何将数组列表保存到SQLite数据库中的解决方案,那将不胜感激。或者有任何其他选项来保存我的数据数组,我应该考虑?
要插入 :
ArrayList<String> inputArray=new ArrayList<String>();
//....向输入添加值数组
Gson gson = new Gson();
String inputString= gson.toJson(inputArray);
System.out.println("inputString= " + inputString);
使用“inputString”在SQLite数据库中保存ArrayList的值
要检索:
从 SQLiteDatabse 中获取您保存并更改为 ArrayList 类型的字符串,如下所示:outputarray 是一个字符串,用于此示例,它是从 SQLiteDatabase 获取的。
Type type = new TypeToken<ArrayList<String>>() {}.getType();
ArrayList<String> finalOutputString = gson.fromJson(outputarray, type);
请原谅我野蛮地抄袭了我之前对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。你不能在MySQL中使用BINARY()或VARBINARY()。我知道你在问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