1

こんにちは、基本的に、リストビューを更新できるように、sqlite データベースの列項目に関するキーと値のペアを取得して保存する方法を探しています。

例:「グループ」という名前の列があり、「家族」という名前の項目エントリがある場合。そのアイテムに関して、そのアイテム「家族」だけの連絡先(名前と番号)のリストを保存または取得できるようにしたいと考えています。別の項目エントリについても同様です。

これを行う最良の方法は何ですか? json経由でハッシュマップのArrayListを使用して、テーブルの列に連絡先の詳細を保存しようとしました。しかし、このようにするのに問題があります。私はこれを試しました:

保存時:

//already have the name and number from using the android contacts api

    final ArrayList<HashMap<String,String>> contacts = new ArrayList<HashMap<String,String>>();     
    HashMap<String, String> map = new HashMap<String,String>();
            map.put(name, number);
            contacts.add(map);

            JSONObject json_contacts = new JSONObject();

                try {
            json_contacts.put("contacts_Arrays", new JSONArray(contacts));
                    arraylist_to_string = json_contacts.toString();

                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            ContentValues values = new ContentValues(); 
            values.put(ContactDB.GROUP, groupname);
            values.put(ContactDB.GROUP_CONTACTS, arraylist_to_string);

            Log.d(TAG, "Successfully updating contacts for group");
            dbadapter.updateGroup(rowId, values);
            cursoradapter.notifyDataSetChanged();

bindview メソッドで取得する場合:

String contactDetails = cursor.getString(cursor.getColumnIndex(ContactDB.GROUP_CONTACTS));

        if(contactDetails != null){
            try {
                JSONObject json = new JSONObject(contactDetails);
                JSONArray json_array = json.optJSONArray("contacts_Arrays");

                for(int i=0; i < json_array.length(); i++){
    LinkedHashMap<String,String> map = new LinkedHashMap<String, String>();
            Iterator<String> myIterator = map.keySet().iterator();
                    while(myIterator.hasNext()){
                       key = (String)myIterator.next();
                       value = (String)map.get(key);

                       holder.contact_name.setText(key);
                       holder.contact_number.setText(value);                           
                       notifyDataSetChanged();

                    }
                }


            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            return;
        }
    }

まったく運がなく、そもそもそれを行う正しい方法かどうかわかりません。データベース テーブルを構成する最善の方法は何でしょうか。連絡先オブジェクトを作成して保存する必要がありますか、それともより良い方法がありますか? ありがとうございました

4

1 に答える 1

5

コードを見るだけで、保存されているデータのサイズによっては、複数のHashMapインスタンスがメモリを過剰に使用している可能性があります。List

キーと値のペアを保存したいので、(SQLite のような) リレーショナル データベースはほとんどの場合、適切な決定ではありません。Android には、単純なキーと値のペア (プリミティブ データ型) を格納するための「共有設定」があります。


SQLite で実装する必要がある場合は、リレーショナルな方法を使用する必要があります。あなたの質問を正しく理解していれば、次のような表が表示されます。

Table "Groups"
+----------+------------+
| group_ID | group_name |
+----------+------------+
| 1        | Family     |
| 2        | Work       |
+----------+------------+

Table "Contacts"
+----------+------------+--------+
| name     | number     | group  |
+----------+------------+--------+
| Jon      | 0173401... | 1      |
| James    | 057123...  | 2      |
| Lukas    | 012343...  | 2      |
+----------+------------+--------+

このテーブルから、"James" と "Lukas" が "Work" グループのメンバーであることを照会できます。次に、-table ( 「Work」グループ用)groupに示されている値に設定された -columnを持つエントリを検索するだけで、「Work」グループのすべてのメンバーを照会できます。group2

このシステムを使用すると、新しいグループと連絡先を追加して、連絡先を (または複数の) グループに入れることができます。

于 2012-06-27T15:56:10.907 に答える