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
viewplaincopy
[*]packagecodyy.liuyong;
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
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
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]