Cursor记录集游标、ListView和SimpleCursorAdapter、ListView数据动态更新

最后更新于:2022-04-01 19:58:06

Cursor记录集游标、ListView和SimpleCursorAdapter、ListView数据动态更新 Email:chentravelling@163.com 为什么要把**Cursor、ListView、SimpleCursorAdapter**这三个放在一起来讲呢?实在是因为在使用的时候,这三个太紧密相关了。 环境: IDE:Android Studio JDK:1.8 系统:win7 64位 ### 一、Cursor 在android系统中使用SQLite数据库,那么Cursor就会经常使用,使用方式大概如下: ~~~ SQLiteDatabase db; //... String sql = "select * from 表"; Cursor cursor = db.rawQuery(sql,null); ~~~ 即我们查询数据返回得到的是一个封装成Cursor的对象,这就是一个记录集,包含了所有查询得到的记录。那么关于Cursor类简单介绍一下几种关键方法: 首先,我们要使用Cursor记录集游标,就必须知道查询语句中表的字段名、数据类型。 - moveToFirst()游标移动到第一行,一般用这个方法判断查询结果是否为空 > 使用方法: ~~~ if(cursor.moveToFirst()==false) return; ~~~ - moveToLast()游标移动到最后一行 - moveToPosition(int position)游标移动到指定行 - moveToPrevious()游标移动到前一行 - moveToNext()游标移动到下一行,主要用于遍历获取数据 > 使用方法: ~~~ List> list = new ArrayList>(); Map map; while (cursor.moveToNext()) { map = new HashMap(); map.put("name",cursor.getString(cursor.getColumnIndex("name"))); map.put("phone",cursor.getString(cursor.getColumnIndex("phone"))); map.put("_id",cursor.getString(cursor.getColumnIndex("_id"))); list.add(map); } ~~~ - getColumnIndex(String columnName)获取指定列在cursor记录集中的位置 - getString(int position)获取指定位置的数据 - getColumnName(int columnIndex)获取指定列的字段名 - getColumnCount()获得列的总数 - getCount()获取cursor记录集的行数 - close()关闭游标,释放资源 - isBeforeFirst()游标是否指向第一行 - isAfterLast()游标是否指向最后一行 使用方法: 结合isBeforeFirst()、isAfterLast()、moveToNext()三个方法,我们将可以通过for循环来遍历整个记录集 ~~~ for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()) { //获取数据,和while()循环一样; } ~~~ - isClosed()是否关闭游标 > 还有一些其他方法吧,暂时没有用过,所以就不罗列了,上面已经把非常常用的方法列举了。 ### 二、ListView和SimpleCursorAdapter 当我们从数据库中查到了数据以后,一般就会用作界面显示,那么ListView就会经常用到。那么我分三部分讲:1)用于显示数据适配器;2)数据库中数据更新后,ListView也更新。首先我们需要三个元素:ListView、adapter即适配器,用于将数据映射到ListView中、数据。 1)常用方法,根据适配器不一样,或者数据不一样,我们要选择的方法也不一样。一般分为三种:**ArrayAdapter、SimpleAdapter和SimpleCursorAdapter**。第一种最简单 ,只能用于显示一行文字,第二种扩展性更好,支持自定义,第三种主要适用于Cursor记录集游标。对于第一种适配器,本人没有上代码测试过,所以就不讲了。 - SimpleAdapter 很好的扩展性,可以显示图片、各种控件等等。 ~~~ public class ShowAddressActivity extends ListActivity { private AddressDAO addressDAO; private SimpleAdapter adapter; private Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //查数据库返回所有联系人 addressDAO = new AddressDAO(this); cursor = addressDAO.query(); List> list = new ArrayList>(); Map map; //遍历数据 while (cursor.moveToNext()) { map = new HashMap(); map.put("name",cursor.getString(cursor.getColumnIndex("name"))); map.put("phone",cursor.getString(cursor.getColumnIndex("phone"))); map.put("_id",cursor.getString(cursor.getColumnIndex("_id"))); list.add(map); } adapter = new SimpleAdapter(this,list,R.layout.address_list,new String[]{"_id","name","phone"},new int[]{R.id.id,R.id.name,R.id.phone}); setAdapter(adapter); ~~~ 首先我们需要把查询的数据从cursor游标再次封装到有HashMap构成的list中,然后再使用new SimpleAdapter();将数据映射到xml文件中,完成适配:映射规则如下图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-18_56eb6a34c8e4a.jpg) - SimpleCursorAdapter ~~~ public class ShowAddressActivity extends ListActivity { private AddressDAO addressDAO; private SimpleCursorAdapter adapter; private Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.show_address); //查数据库返回所有联系人 addressDAO = new AddressDAO(this); cursor = addressDAO.query(); adapter = new SimpleCursorAdapter(this,R.layout.address_list,cursor,new String[]{"_id","name","phone"},new int[]{R.id.id,R.id.name,R.id.phone}); ListView listView = (ListView)findViewById(android.R.id.list); listView.setAdapter(adapter); //.. } ~~~ 其中涉及到了两个xml文件:show_address.xml和address_list.xml,布局代码如下: (1)show_address.xml:包含一个搜索框、一个增加按钮和一个ListView ~~~
';