web-dev-qa-db-ja.com

ArrayListをSQLiteデータベースにAndroid

私はAndroidでSQLiteを使用しており、配列リストをテーブルの列に追加してから、データを配列リストとしてフェッチします。配列リストはLongのリストです。SQLにはBLOBを格納するオプションがあることに気付きましたが、SQLiteデータベースにblobとして格納する前に、arraylistをbyte []に​​変換する必要があるようです。

アレイリストをSQLiteデータベースに保存する方法について誰かが解決策を持っている場合、それは大歓迎です。または、データの配列を保存するための他のオプションはありますか?

18
Mango

挿入するには:

ArrayList<String> inputArray=new ArrayList<String>();

//....inputArrayに値を追加

Gson gson = new Gson();

String inputString= gson.toJson(inputArray);

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

"inputString"を使用して、ArrayListの値をSQLiteデータベースに保存します

取得するには:

以下のように保存してArrayList型に変更したものをSQLiteDatabseから取得します。outputarrayは、この例ではSQLiteDatabaseから取得した文字列です。

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

ArrayList<String> finalOutputString = gson.fromJson(outputarray, type);
  • SQLiteでは、テキストをフォーマットとして使用して文字列Value .....を格納します。
27
Ashok

MySQLテーブルに配列を格納するためのBLOBとVARCHARの比較 に対する私の以前の答えをひどく盗用したことを許してください。向こうの他の答えも非常に適切です。

Javaの組み込みシリアル化では追加のバイトが必要になり、Java以外のアプリケーションではデータの処理が難しくなるため、Conのアプローチは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を超えるlong(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
7
Julius Musseau

私には2つのArrayList<String>があり、どちらも1000以上のエントリになります。 blobとバイトを調べましたが、プロセスを高速化して使用可能にする解決策は、挿入メソッドを変更してdatabase.insertを削除することでした-これに対するクレジットは here です。

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などに簡単に適応でき、すばやく軽量化されます。ありがたいことに、ブロブとバイトについて頭を悩ませる必要はもうありませんでした。それが役に立てば幸い。

6
brandall

そのようなことを完全に別の方法で行う簡単な方法があります。すべての配列値で構成される文字列を作成できます。そのためには、StringBuilderを作成し、値を継続的に追加し、セパレーターを付けて(たとえば、配列の値で使用しないsimboleのようにします。たとえば、次のコードでは、仮想 '|'です。

double[] mylist = new double[]{23, 554, 55};
    StringBuilder str = null;
    str = new StringBuilder();

    for(int i=0;i<mylist.length;i++){
        str.append(mylist[i]+"|");
    }

    String result = str.toString();

    db.open();
    db.insert(result);
    db.close();

それらをフェッチして値を使用する場合。データベースから列を純粋な文字列に取得し、splite()oprationを使用して、配列の列にある配列の各値をuで簡単に使用できるようにします。

コードでそれを行うことができます:

String str = db.getdata();
    String[] list = str.split("|");

単純な変換では、それらをdoubleとして使用できます。

double mydouble = Double.parsDouble(list[1].toString());

多分それは標準ではありませんが、それは役に立ちます、助けを願っています;)

4
Mohammad Hadi

リストをシリアル化したいようです。 これはチュートリアル/イントロです to Java Serialization API。

2
matt b

あなたはそれを手動で行う必要があり、リストの各項目を通過し、それをデータベースに保存する前にバイトに変更する必要があります

for (long l : array<long>){
//change to byte here
//Store in database here
}
1
Con
    ArrayList<String> list = new ArrayList<String>();
                    list.add("Item 1");
                    list.add("Item 2");
                    list.add("Item 3");

                    String joined = TextUtils.join(",", list);
                    Log.i(TAG, "joined strings: " + joined);

                    String[] array = TextUtils.split(joined, ",");
                    Log.i(TAG, "joined strings: " + array[0] + array[1] + array[2]);
0
JamisonMan111