问题描述
我是新来的Java,Android和SQLite和我被困在此。我有列,即 _id
(自动增量),键入
,金额
(INT),类别
和说明
。三个查询。
首先,我无法删除数据库中检索事务处理(行)。 (详情请参阅附logcat的)。
其次,我需要知道如何删除条目之后刷新的ListView。
第三,傻问题,我认为。如果我打开一次数据库和检索数据,它这样做。此外,在不关闭数据库,如果我删除事务不删除它,并给出了错误数据库无法打开。此外,如果我检索后关闭数据库,然后在删除的时间再次打开,它的工作原理。我不明白这一点。主要的问题是第一位的,但请你回答,如果你知道上述任何
最终的ListView LV = getListView();
localArrayList.clear(); //要停止愚蠢的重复问题
localDbCrud =新DbCrud(本);
localAdapter =新SimpleAdapter(
这个,
localArrayList,
R.layout.transaction_list_item,
新的String [] {金额,类别,日期,说明},
新的INT [] {R.id.tli_amount,R.id.tli_category,R.id.tli_date,R.id.tli_desc}); localDbCrud.open();
DbCrud.getAllTransaction(); //使用HashMap的localHashMap,localHashMap.put(localArrayList)环路
localDbCrud.close();
lv.setOnItemLongClickListener(新OnItemLongClickListener(){ 公共布尔onItemLongClick(最终适配器视图<>为arg0,ARG1查看,
最终诠释ARG2,最终长ARG3){
// TODO自动生成方法存根
AlertDialog.Builder ladbuilder =新生成器(TransactionList.this);
ladbuilder.setTitle(选择您的选择);
ladbuilder.setItems(R.array.alertdialog_prompt,新DialogInterface.OnClickListener(){ 公共无效的onClick(DialogInterface对话,诠释selected_item){
// TODO自动生成方法存根
如果(selected_item == 0){
localDbCrud.open();
HashMap的itemMap =(HashMap的)localAdapter.getItem(ARG2);
INT ITEM_ID =(整数)itemMap.get(ID);
DbCrud.deleteTransaction(ITEM_ID);
//最终诠释ITE =(整数)arg0.getItemAtPosition(ARG2);
//最终诠释ITEM_ID = c.getInt(c.getColumnIndex(DbCrud.TN_ID));
//DbCrud.deleteTransaction(item_id);
localDbCrud.close(); }
其他{
//更新code }
}
});
AlertDialog localad = ladbuilder.create();
localad.show();
返回false;
}
}); localDbCrud.close(); setListAdapter(localAdapter);}
logcat的
1月10日至13日:21:26.804:E / AndroidRuntime(22023):致命异常:主要
1月10日至13日:21:26.804:E / AndroidRuntime(22023):java.lang.ClassCastException:java.lang.String中
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在com.hishighness.budgetracker.TransactionList $ 1 $ 1.onClick(TransactionList.java:62)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在com.android.internal.app.AlertController $ AlertParams $ 3.onItemClick(AlertController.java:878)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.widget.AdapterView.performItemClick(AdapterView.java:284)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.widget.ListView.performItemClick(ListView.java:3701)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.widget.AbsListView $ PerformClick.run(AbsListView.java:1970)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.os.Handler.handleCallback(Handler.java:587)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.os.Handler.dispatchMessage(Handler.java:92)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.os.Looper.loop(Looper.java:130)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在android.app.ActivityThread.main(ActivityThread.java:3687)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在java.lang.reflect.Method.invokeNative(本机方法)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在java.lang.reflect.Method.invoke(Method.java:507)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:842)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
1月10日至13日:21:26.804:E / AndroidRuntime(22023):在dalvik.system.NativeStart.main(本机方法)
这里的getallTransaction()功能。本是哈希映射在我的项目中唯一跟踪
公共静态无效getAllTransaction(){ 光标localCursor = localDatabase.query(真,TN_TABLE,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
如果(localCursor!= NULL){ localCursor.moveToFirst();
做{
HashMap的<字符串,字符串>临时=新的HashMap<字符串,字符串>();
temp.put(数量,localCursor.getString(localCursor.getColumnIndex(额)));
temp.put(类别,localCursor.getString(localCursor.getColumnIndex(类)));
temp.put(日期,localCursor.getString(localCursor.getColumnIndex(DATE)));
temp.put(描述,localCursor.getString(localCursor.getColumnIndex(说明)));
temp.put(ID,localCursor.getString(localCursor.getColumnIndex(_ ID)));
TransactionList.localArrayList.add(临时); }而(localCursor.moveToNext()); }
Line 61 is casting the result of arg0.getItemAtPosition(arg2)
to Cursor
, but the return type is probably HashMap
(as it says in the Logcat output). Normally you get a Cursor
from a database query.
If you put the ID for each database row into the HashMap
when you're building it, then you'll be able to pass that ID to your deleteTransaction()
call in your onClick
event. So, you need
temp.put("Id", localCursor.getInt(localCursor.getColumnIndex("_id")));
in getAllTransaction()
, and then revise your onClick()
method to do something like this:
localDbCrud.open();
HashMap itemMap = (HashMap)localAdapter.getItem(arg2);
int item_id = Integer.parseInt((String)itemMap.get("Id"));
DbCrud.deleteTransaction(item_id);
localDbCrud.close();
I would also suggest renaming arg2
(and others) to have clearer names so that the code is easier to follow.
You can call notifyDataSetChanged()
on your adapter to refresh the ListView
after you've made a change to the dataset.
EDIT: Please note that SimpleAdapter
is meant for static data, so your mileage may vary. The best solution is probably to switch to a different type of adapter, such as ArrayAdapter
, or make a new SimpleAdapter
every time you change the dataset.
这篇关于删除查询和刷新的ListView在Android中(源码)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!