android: listview与sqlite数据操作实例

ListView与Sqlite数据库绑定步骤:

1.将Sqlite数据库的内容查询出来并放入数组列表中,形成ListView的数据源;

2.适配器绑定数据源,显示在ListView item中。

本文实现的ListView与Sqlite数据绑定的功能如下图-1

图-1 ListView与Sqlite数据绑定的功能界面

本例主要实现的是一个学生数据表(Sqlite数据库)与ListView控件绑定数据的功能。
数据库为user.db,学生表为student,学生表包含的字段有:id,username,birthday,image。
image放在android的资源文件内。初始化时,自动创建数据库,用户表并插入三条用户数据,以作为Listview的数据源。
通过SimpleAdapter适配器与ListView控件绑定。

关于ListView与SimpleAdapter数据绑定,以及Sqlite数据库的创建,表的创建,表的操作,在本博客中有所叙述,这里不再叙述。可以说本文是将ListView使用与Sqlite使用相结合的结果,只是有更多的细节需要注意。

除了绑定数据库,还增加一个ListView长按Item选项的事件操作,本例长按ListView数据选项后会弹出一个询问的对话框,询问是否删除当前选项的数据表的一条数据。实现Listview长按响应事件,需要实现OnCreateContextMenuListener类的方法。通过AdapterView.AdapterContextMenuInfo类获取选项的相应位置,也就是数据源的具体数据,获取选项位置后,可以提取相应选项的内容进而执行相关的操作。

图片添加如下图


1.类文件

ListView_SqliteActivity.java

[java] view plain copy
  1. packagecodyy.liuyong;
[java] view plain copy
  1. importjava.util.ArrayList;
  2. importjava.util.HashMap;
  3. importandroid.app.Activity;
  4. importandroid.app.AlertDialog;
  5. importandroid.content.ContentValues;
  6. importandroid.content.DialogInterface;
  7. importandroid.database.Cursor;
  8. importandroid.database.SQLException;
  9. importandroid.database.sqlite.SQLiteDatabase;
  10. importandroid.os.Bundle;
  11. importandroid.view.ContextMenu;
  12. importandroid.view.ContextMenu.ContextMenuInfo;
  13. importandroid.view.View;
  14. importandroid.view.View.OnCreateContextMenuListener;
  15. importandroid.widget.AdapterView;
  16. importandroid.widget.ListView;
  17. importandroid.widget.SimpleAdapter;
  18. importandroid.widget.Toast;
  19. publicclassListView_SqliteActivityextendsActivity{
  20. SQLiteDatabasemDb;
  21. SQLiteDatabaseDaodao;
  22. //存储数据的数组列表
  23. ArrayList<HashMap<String,Object>>listData;
  24. //适配器
  25. SimpleAdapterlistItemAdapter;
  26. /**Calledwhentheactivityisfirstcreated.*/
  27. @Override
  28. publicvoidonCreate(BundlesavedInstanceState){
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.main);
  31. dao=newSQLiteDatabaseDao();
  32. ListViewlist=(ListView)findViewById(R.id.list_items);
  33. listItemAdapter=newSimpleAdapter(ListView_SqliteActivity.this,
  34. listData,//数据源
  35. R.layout.item,//ListItem的XML实现
  36. //动态数组与ImageItem对应的子项
  37. newString[]{"image","username","birthday"},
  38. //ImageItem的XML文件里面的一个ImageView,两个TextViewID
  39. newint[]{R.id.image,R.id.username,R.id.birthday});
  40. list.setAdapter(listItemAdapter);
  41. list.setOnCreateContextMenuListener(listviewLongPress);
  42. }
  43. //简单的数据库操作类
  44. classSQLiteDatabaseDao{
  45. publicSQLiteDatabaseDao(){
  46. mDb=openOrCreateDatabase("users.db",
  47. SQLiteDatabase.CREATE_IF_NECESSARY,null);
  48. //初始化创建表
  49. createTable(mDb,"student");
  50. //初始化插入数据
  51. insert(mDb,"student");
  52. //初始化获取所有数据表数据
  53. getAllData("student");
  54. }
  55. //创建一个数据库
  56. publicvoidcreateTable(SQLiteDatabasemDb,Stringtable){
  57. try{
  58. mDb.execSQL("createtableifnotexists"
  59. +table
  60. +"(idintegerprimarykeyautoincrement,"
  61. +"usernametextnotnull,birthdaytextnotnull,imagetext);");
  62. }catch(SQLExceptione){
  63. Toast.makeText(getApplicationContext(),"数据表创建失败",
  64. Toast.LENGTH_LONG).show();
  65. }
  66. }
  67. //插入数据
  68. publicvoidinsert(SQLiteDatabasemDb,Stringtable){
  69. //初始化插入3条数据
  70. ContentValuesvalues=newContentValues();
  71. values.put("username","LiMei");
  72. values.put("birthday","Birthday:6-18");
  73. values.put("image",R.drawable.o);
  74. mDb.insert(table,null,values);
  75. values.put("username","LinQiao");
  76. values.put("birthday","Birthday:8-22");
  77. values.put("image",R.drawable.t);
  78. mDb.insert(table,null,values);
  79. values.put("username","WiLee");
  80. values.put("birthday","Birthday:9-12");
  81. values.put("image",R.drawable.f);
  82. mDb.insert(table,null,values);
  83. }
  84. //查询所有数据
  85. publicvoidgetAllData(Stringtable){
  86. Cursorc=mDb.rawQuery("select*from"+table,null);
  87. intcolumnsSize=c.getColumnCount();
  88. listData=newArrayList<HashMap<String,Object>>();
  89. //获取表的内容
  90. while(c.moveToNext()){
  91. HashMap<String,Object>map=newHashMap<String,Object>();
  92. for(inti=0;i<columnsSize;i++){
  93. map.put("id",c.getString(0));
  94. map.put("username",c.getString(1));
  95. map.put("birthday",c.getString(2));
  96. map.put("image",c.getString(3));
  97. }
  98. listData.add(map);
  99. }
  100. }
  101. //删除一条数据
  102. publicbooleandelete(SQLiteDatabasemDb,Stringtable,intid){
  103. StringwhereClause="id=?";
  104. String[]whereArgs=newString[]{String.valueOf(id)};
  105. try{
  106. mDb.delete(table,whereClause,whereArgs);
  107. }catch(SQLExceptione){
  108. Toast.makeText(getApplicationContext(),"删除数据库失败",
  109. Toast.LENGTH_LONG).show();
  110. returnfalse;
  111. }
  112. returntrue;
  113. }
  114. }
  115. //长按事件响应
  116. OnCreateContextMenuListenerlistviewLongPress=newOnCreateContextMenuListener(){
  117. @Override
  118. publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
  119. ContextMenuInfomenuInfo){
  120. //TODOAuto-generatedmethodstub
  121. finalAdapterView.AdapterContextMenuInfoinfo=(AdapterView.AdapterContextMenuInfo)menuInfo;
  122. newAlertDialog.Builder(ListView_SqliteActivity.this)
  123. /*弹出窗口的最上头文字*/
  124. .setTitle("删除当前数据")
  125. /*设置弹出窗口的图式*/
  126. .setIcon(android.R.drawable.ic_dialog_info)
  127. /*设置弹出窗口的信息*/
  128. .setMessage("确定删除当前记录")
  129. .setPositiveButton("是",
  130. newDialogInterface.OnClickListener(){
  131. publicvoidonClick(
  132. DialogInterfacedialoginterface,inti){
  133. //获取位置索引
  134. intmListPos=info.position;
  135. //获取对应HashMap数据内容
  136. HashMap<String,Object>map=listData
  137. .get(mListPos);
  138. //获取id
  139. intid=Integer.valueOf((map.get("id")
  140. .toString()));
  141. //获取数组具体值后,可以对数据进行相关的操作,例如更新数据
  142. if(dao.delete(mDb,"student",id)){
  143. //移除listData的数据
  144. listData.remove(mListPos);
  145. listItemAdapter.notifyDataSetChanged();
  146. }
  147. }
  148. })
  149. .setNegativeButton("否",
  150. newDialogInterface.OnClickListener(){
  151. publicvoidonClick(
  152. DialogInterfacedialoginterface,inti){
  153. //什么也没做
  154. }
  155. }).show();
  156. }
  157. };
  158. @Override
  159. publicvoidfinish(){
  160. //TODOAuto-generatedmethodstub
  161. super.finish();
  162. mDb.close();
  163. }
  164. }

2.xml文件

main.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical">
  6. <ListView
  7. android:id="@+id/list_items"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:divider="#ffffff"
  11. android:dividerHeight="1dip"/>
  12. </RelativeLayout>

item.xml
[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/RelativeLayout"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content"
  6. android:paddingBottom="4dip"
  7. android:paddingLeft="12dip"
  8. android:paddingRight="12dip">
  9. <ImageView
  10. android:id="@+id/image"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_alignParentRight="true"
  14. android:paddingLeft="6dip"
  15. android:paddingTop="6dip"/>
  16. <TextView
  17. android:id="@+id/username"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:paddingTop="6dip"
  21. android:textColor="#ccc"
  22. android:textSize="18dip"/>
  23. <TextView
  24. android:id="@+id/birthday"
  25. android:layout_width="fill_parent"
  26. android:layout_height="wrap_content"
  27. android:layout_below="@+id/username"
  28. android:maxLines="2"
  29. android:paddingRight="20dip"
  30. android:textColor="#fff"/>
  31. </RelativeLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值