1

私はJava、Android、およびSQLiteが初めてで、これで立ち往生しています。_id(autoincrement) typeamount(int)、categoryおよびという列がありますdescription。3 つのクエリ。

まず、データベースから取得したトランザクション (行) を削除できません。(添付の Logcat を参照してください)。

次に、エントリを削除した後に ListView を更新する方法を知る必要があります。

そして第三に、私が思うばかげた問題です。データベースを 1 回開いてデータを取得すると、それが行われます。さらに、データベースを閉じずにトランザクションを削除すると、トランザクションは削除されず、「データベースが開いていません」というエラーが表示されます。さらに、取得後にデータベースを閉じ、削除時に再度開くと機能します。理解できません。本題は1つ目ですが、上記の中で分かる方がいましたら回答お願いします

    final ListView lv = getListView();
    localArrayList.clear();                //To Stop the silly repeating issue
    localDbCrud = new DbCrud(this);
    localAdapter = new SimpleAdapter(
            this,
            localArrayList,
            R.layout.transaction_list_item,
            new String[]{"Amount","Category","Date","Description"},
            new int[]{R.id.tli_amount,R.id.tli_category,R.id.tli_date,R.id.tli_desc});

    localDbCrud.open();
    DbCrud.getAllTransaction();             //Using HashMap localHashMap , localHashMap.put(localArrayList) in loop
    localDbCrud.close();
    lv.setOnItemLongClickListener(new OnItemLongClickListener() {

        public boolean onItemLongClick(final AdapterView<?> arg0, View arg1,
                 final int arg2, final long arg3) {
            // TODO Auto-generated method stub
            AlertDialog.Builder ladbuilder = new Builder(TransactionList.this);
            ladbuilder.setTitle("Choose Your Option");
            ladbuilder.setItems(R.array.alertdialog_prompt, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int selected_item) {
                    // TODO Auto-generated method stub
                    if (selected_item == 0){
                        localDbCrud.open();
                        HashMap itemMap = (HashMap)localAdapter.getItem(arg2);
                        int item_id =(Integer) itemMap.get("Id");
                        DbCrud.deleteTransaction(item_id);
                        //final int ite=  (Integer) arg0.getItemAtPosition(arg2);
                         // final int item_id = c.getInt(c.getColumnIndex(DbCrud.TN_ID));
                        //DbCrud.deleteTransaction(item_id);
                        localDbCrud.close();

                    }
                    else{


                        //update code

                    }
                }
            });
            AlertDialog localad = ladbuilder.create();
            localad.show();


            return false;
        }
    });

    localDbCrud.close();

    setListAdapter(localAdapter);

}

ログキャット

10-13 01:21:26.804: E/AndroidRuntime(22023): FATAL EXCEPTION: main
10-13 01:21:26.804: E/AndroidRuntime(22023): java.lang.ClassCastException: java.lang.String
10-13 01:21:26.804: E/AndroidRuntime(22023):    at com.hishighness.budgetracker.TransactionList$1$1.onClick(TransactionList.java:62)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:878)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.widget.ListView.performItemClick(ListView.java:3701)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1970)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.os.Handler.handleCallback(Handler.java:587)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.os.Looper.loop(Looper.java:130)
    10-13 01:21:26.804: E/AndroidRuntime(22023):    at android.app.ActivityThread.main(ActivityThread.java:3687)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at java.lang.reflect.Method.invokeNative(Native Method)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at java.lang.reflect.Method.invoke(Method.java:507)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
10-13 01:21:26.804: E/AndroidRuntime(22023):    at dalvik.system.NativeStart.main(Native Method)

ここに getallTransaction() 関数があります。これは、私のプロジェクトのハッシュ マップの唯一のトレースです。

    public static void getAllTransaction(){

    Cursor localCursor = localDatabase.query(true, TN_TABLE, null, null, null, null, null, null, null) ;
    if (localCursor != null) {

        localCursor.moveToFirst();
            do{
                HashMap<String,String> temp = new HashMap<String,String>();
                temp.put("Amount", localCursor.getString(localCursor.getColumnIndex("amount")));
                temp.put("Category", localCursor.getString(localCursor.getColumnIndex("category")));
                temp.put("Date", localCursor.getString(localCursor.getColumnIndex("date")));
                temp.put("Description", localCursor.getString(localCursor.getColumnIndex("description")));
                temp.put("Id", localCursor.getString(localCursor.getColumnIndex("_id")));
                TransactionList.localArrayList.add(temp);



            }while (localCursor.moveToNext());

    }
4

1 に答える 1

1

まず、データベースから取得したトランザクション(行)を削除できません

行61はの結果をにキャストしてarg0.getItemAtPosition(arg2)Cursorますが、戻り値のタイプはおそらくHashMap(Logcat出力に示されているように)です。通常Cursor、データベースクエリからを取得します。

構築時に各データベース行のIDを入力すると、イベントでそのIDを呼び出しにHashMap渡すことができます。だから、あなたは必要ですdeleteTransaction()onClick

temp.put("Id", localCursor.getInt(localCursor.getColumnIndex("_id")));

で、次に次のようなことを行うようにメソッドをgetAllTransaction()修正します。onClick()

localDbCrud.open();
HashMap itemMap = (HashMap)localAdapter.getItem(arg2);
int item_id = Integer.parseInt((String)itemMap.get("Id"));
DbCrud.deleteTransaction(item_id);
localDbCrud.close();

arg2また、コードをわかりやすくするために、名前を変更(およびその他)して名前を明確にすることをお勧めします。

次に、エントリを削除した後にリストビューを更新する方法を知る必要があります

データセットに変更を加えた後、アダプタを呼び出しnotifyDataSetChanged()て更新することができます。ListView

SimpleAdapter編集:これは静的データを対象としているため、マイレージが異なる場合があることに注意してください。最善の解決策は、おそらく、などの別のタイプのアダプターに切り替えるか、データセットを変更するたびArrayAdapterに新しいアダプターを作成することです。SimpleAdapter

于 2012-10-12T00:16:07.643 に答える