在 Android 的 SQLite 数据库中保存 ArrayList

2022-09-01 22:00:47

我一直在Android上使用SQLite,我想将数组列表添加到表中的列中,然后将数据作为数组列表取回。数组列表是 Long 的列表。我注意到SQL有一个存储BLOBS的选项,但是看起来我需要先将数组列表转换为byte[],然后才能将其作为blob存储在我的SQLite数据库中。

如果有人有一个如何将数组列表保存到SQLite数据库中的解决方案,那将不胜感激。或者有任何其他选项来保存我的数据数组,我应该考虑?


答案 1

要插入 :

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);
  • 在 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。你不能在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

推荐