在Android中的SQLite数据库中保存ArrayList
我一直在Android上使用SQLite,我想在表中添加一个ArrayList到列中,然后作为一个ArrayList返回数据。 arraylist是一个Longs列表。 我注意到SQL有一个用于存储BLOBS的选项,但是它看起来像我需要先将数组列表转换为byte [],然后才能将它作为blob存储在我的SQLite数据库中。
如果任何人有解决如何将数据列表保存到SQLite数据库,将不胜感激。 或者还有其他的选择来保存我的数据,我应该考虑一下吗?
插入:
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);
请原谅我野蛮剽窃我以前对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
我有两个ArrayList<String>
,都将有1000+条目。 我查看blob和字节,但对于我来说,加快进程并使其可用的解决方案是通过更改插入方法并删除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();
}
}
它很容易适应Longs和Integers等,并且可以快速减轻负担。 所以谢天谢地,我不必再为了斑点和字节而挠头了! 希望能帮助到你。
链接地址: http://www.djcxy.com/p/74573.html上一篇: Saving ArrayList in SQLite database in Android
下一篇: How to use an existing database with an Android application