当前位置:  开发笔记 > 编程语言 > 正文

在Android中的SQLite数据库中保存ArrayList

如何解决《在Android中的SQLite数据库中保存ArrayList》经验,为你挑选了3个好方法。

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

如果有人有一个如何将arraylists保存到SQLite数据库的解决方案,将非常感激.或者是否有任何其他选项来保存我的数据数组,我应该考虑?



1> 小智..:

要插入:

ArrayList inputArray=new ArrayList();

//添加值为inputArray

Gson gson = new Gson();

String inputString= gson.toJson(inputArray);

System.out.println("inputString= " + inputString);

使用"inputString"在SQLite数据库中保存ArrayList的值

要撤消:

从SQLiteDatabse中获取保存的字符串并将其更改为ArrayList类型,如下所示:outputarray是一个String,它是从SQLiteDatabase获取的示例.

Type type = new TypeToken>() {}.getType();

ArrayList finalOutputString = gson.fromJson(outputarray, type);

在SQLite中使用text作为格式来存储字符串Value .....


@ Md.ImranChoudhury'Gson(https://github.com/google/gson)是一个用于使用反射将Java对象转换为JSON和从JSON转换的库.

2> Julius Musse..:

请原谅我剽窃我之前对BLOB vs. VARCHAR的回答,以便在MySQL表中存储数组.那里的其他答案也非常相关.

我认为Con的方法可能比使用java序列化更好,因为java的内置序列化将需要额外的字节,而非Java应用程序将更难处理数据.

public static void storeInDB(ArrayList 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 readFromDB() throws IOException, SQLException {

    ArrayList longs = new ArrayList();
    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



3> brandall..:

我有两个ArrayList,都会有1000多个条目.我查看了blob和字节,但对我来说,加速进程并使其可用的解决方案是通过更改插入方法并摆脱database.insert- 对此的信用就 在这里.

private static final String INSERT = "insert into "
            + YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", "
            + COLUMN_2 + ") values (?, ?)";

public void insertArrayData(ArrayList array1,
            ArrayList 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等,并且快速闪电.所以谢天谢地,我不再需要关注blob和字节了!希望能帮助到你.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有