设为首页 收藏本站
查看: 876|回复: 0

[经验分享] android: listview与sqlite数据操作实例

[复制链接]

尚未签到

发表于 2016-11-30 09:40:57 | 显示全部楼层 |阅读模式
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]viewplaincopy



  • packagecodyy.liuyong;

[java]viewplaincopy



  • importjava.util.ArrayList;
  • importjava.util.HashMap;

  • importandroid.app.Activity;
  • importandroid.app.AlertDialog;
  • importandroid.content.ContentValues;
  • importandroid.content.DialogInterface;
  • importandroid.database.Cursor;
  • importandroid.database.SQLException;
  • importandroid.database.sqlite.SQLiteDatabase;
  • importandroid.os.Bundle;
  • importandroid.view.ContextMenu;
  • importandroid.view.ContextMenu.ContextMenuInfo;
  • importandroid.view.View;
  • importandroid.view.View.OnCreateContextMenuListener;
  • importandroid.widget.AdapterView;
  • importandroid.widget.ListView;
  • importandroid.widget.SimpleAdapter;
  • importandroid.widget.Toast;

  • publicclassListView_SqliteActivityextendsActivity{

  • SQLiteDatabasemDb;
  • SQLiteDatabaseDaodao;
  • //存储数据的数组列表
  • ArrayList<HashMap<String,Object>>listData;
  • //适配器
  • SimpleAdapterlistItemAdapter;

  • /**Calledwhentheactivityisfirstcreated.*/
  • @Override
  • publicvoidonCreate(BundlesavedInstanceState){
  • super.onCreate(savedInstanceState);
  • setContentView(R.layout.main);
  • dao=newSQLiteDatabaseDao();

  • ListViewlist=(ListView)findViewById(R.id.list_items);
  • listItemAdapter=newSimpleAdapter(ListView_SqliteActivity.this,
  • listData,//数据源
  • R.layout.item,//ListItem的XML实现
  • //动态数组与ImageItem对应的子项
  • newString[]{"image","username","birthday"},
  • //ImageItem的XML文件里面的一个ImageView,两个TextViewID
  • newint[]{R.id.image,R.id.username,R.id.birthday});
  • list.setAdapter(listItemAdapter);
  • list.setOnCreateContextMenuListener(listviewLongPress);
  • }

  • //简单的数据库操作类

  • classSQLiteDatabaseDao{

  • publicSQLiteDatabaseDao(){
  • mDb=openOrCreateDatabase("users.db",
  • SQLiteDatabase.CREATE_IF_NECESSARY,null);
  • //初始化创建表
  • createTable(mDb,"student");
  • //初始化插入数据
  • insert(mDb,"student");
  • //初始化获取所有数据表数据
  • getAllData("student");
  • }

  • //创建一个数据库
  • publicvoidcreateTable(SQLiteDatabasemDb,Stringtable){
  • try{
  • mDb.execSQL("createtableifnotexists"
  • +table
  • +"(idintegerprimarykeyautoincrement,"
  • +"usernametextnotnull,birthdaytextnotnull,imagetext);");
  • }catch(SQLExceptione){
  • Toast.makeText(getApplicationContext(),"数据表创建失败",
  • Toast.LENGTH_LONG).show();
  • }
  • }

  • //插入数据
  • publicvoidinsert(SQLiteDatabasemDb,Stringtable){

  • //初始化插入3条数据
  • ContentValuesvalues=newContentValues();
  • values.put("username","LiMei");
  • values.put("birthday","Birthday:6-18");
  • values.put("image",R.drawable.o);
  • mDb.insert(table,null,values);

  • values.put("username","LinQiao");
  • values.put("birthday","Birthday:8-22");
  • values.put("image",R.drawable.t);
  • mDb.insert(table,null,values);

  • values.put("username","WiLee");
  • values.put("birthday","Birthday:9-12");
  • values.put("image",R.drawable.f);
  • mDb.insert(table,null,values);

  • }

  • //查询所有数据
  • publicvoidgetAllData(Stringtable){
  • Cursorc=mDb.rawQuery("select*from"+table,null);
  • intcolumnsSize=c.getColumnCount();
  • listData=newArrayList<HashMap<String,Object>>();
  • //获取表的内容
  • while(c.moveToNext()){
  • HashMap<String,Object>map=newHashMap<String,Object>();
  • for(inti=0;i<columnsSize;i++){
  • map.put("id",c.getString(0));
  • map.put("username",c.getString(1));
  • map.put("birthday",c.getString(2));
  • map.put("image",c.getString(3));
  • }
  • listData.add(map);
  • }
  • }

  • //删除一条数据
  • publicbooleandelete(SQLiteDatabasemDb,Stringtable,intid){
  • StringwhereClause="id=?";
  • String[]whereArgs=newString[]{String.valueOf(id)};
  • try{
  • mDb.delete(table,whereClause,whereArgs);
  • }catch(SQLExceptione){
  • Toast.makeText(getApplicationContext(),"删除数据库失败",
  • Toast.LENGTH_LONG).show();
  • returnfalse;
  • }
  • returntrue;
  • }
  • }

  • //长按事件响应
  • OnCreateContextMenuListenerlistviewLongPress=newOnCreateContextMenuListener(){
  • @Override
  • publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
  • ContextMenuInfomenuInfo){
  • //TODOAuto-generatedmethodstub
  • finalAdapterView.AdapterContextMenuInfoinfo=(AdapterView.AdapterContextMenuInfo)menuInfo;
  • newAlertDialog.Builder(ListView_SqliteActivity.this)
  • /*弹出窗口的最上头文字*/
  • .setTitle("删除当前数据")
  • /*设置弹出窗口的图式*/
  • .setIcon(android.R.drawable.ic_dialog_info)
  • /*设置弹出窗口的信息*/
  • .setMessage("确定删除当前记录")
  • .setPositiveButton("是",
  • newDialogInterface.OnClickListener(){
  • publicvoidonClick(
  • DialogInterfacedialoginterface,inti){
  • //获取位置索引
  • intmListPos=info.position;
  • //获取对应HashMap数据内容
  • HashMap<String,Object>map=listData
  • .get(mListPos);
  • //获取id
  • intid=Integer.valueOf((map.get("id")
  • .toString()));
  • //获取数组具体值后,可以对数据进行相关的操作,例如更新数据
  • if(dao.delete(mDb,"student",id)){
  • //移除listData的数据
  • listData.remove(mListPos);
  • listItemAdapter.notifyDataSetChanged();
  • }
  • }
  • })
  • .setNegativeButton("否",
  • newDialogInterface.OnClickListener(){
  • publicvoidonClick(
  • DialogInterfacedialoginterface,inti){
  • //什么也没做

  • }
  • }).show();
  • }
  • };

  • @Override
  • publicvoidfinish(){
  • //TODOAuto-generatedmethodstub
  • super.finish();
  • mDb.close();
  • }
  • }

2.xml文件
main.xml
[html]viewplaincopy



  • <?xmlversion="1.0"encoding="utf-8"?>
  • <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  • android:layout_width="fill_parent"
  • android:layout_height="fill_parent"
  • android:orientation="vertical">

  • <ListView
  • android:id="@+id/list_items"
  • android:layout_width="wrap_content"
  • android:layout_height="wrap_content"
  • android:divider="#ffffff"
  • android:dividerHeight="1dip"/>

  • </RelativeLayout>


item.xml
[html]viewplaincopy



  • <?xmlversion="1.0"encoding="utf-8"?>
  • <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  • android:id="@+id/RelativeLayout"
  • android:layout_width="fill_parent"
  • android:layout_height="wrap_content"
  • android:paddingBottom="4dip"
  • android:paddingLeft="12dip"
  • android:paddingRight="12dip">

  • <ImageView
  • android:id="@+id/image"
  • android:layout_width="wrap_content"
  • android:layout_height="wrap_content"
  • android:layout_alignParentRight="true"
  • android:paddingLeft="6dip"
  • android:paddingTop="6dip"/>

  • <TextView
  • android:id="@+id/username"
  • android:layout_width="fill_parent"
  • android:layout_height="wrap_content"
  • android:paddingTop="6dip"
  • android:textColor="#ccc"
  • android:textSize="18dip"/>

  • <TextView
  • android:id="@+id/birthday"
  • android:layout_width="fill_parent"
  • android:layout_height="wrap_content"
  • android:layout_below="@+id/username"
  • android:maxLines="2"
  • android:paddingRight="20dip"
  • android:textColor="#fff"/>

  • </RelativeLayout>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307526-1-1.html 上篇帖子: [zz]Save SQLite memory database to file 下篇帖子: sqlite之我见--C/C++ API接口介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表