在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);
  • 在SQLite中使用文本作为格式来存储字符串值.....

  • 请原谅我野蛮剽窃我以前对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