zoukankan      html  css  js  c++  java
  • SQLite中Cursor类的说明

    在Android 查询数据是通过Cursor 类来实现的。当我们使用 SQLiteDatabase.query()方法时,就会得到Cursor对象, Cursor所指向的就是每一条数据。

    Cursor 位于 android.database.Cursor类,可见出它的设计是基于数据库服务产生的。

    子类有:

    1.Cursor必知

    • Cursor 是每行的集合。
    • 使用 moveToFirst() 定位第一行
    • 你必须知道每一列的名称
    • 你必须知道每一列的数据类型
    • Cursor 是一个随机的数据源
    • 所有的数据都是通过下标取得

    2.Cursor的重要方法

    3.如何使用

    (1)判断cursor是否为空

    if (cur.moveToFirst() == false)
    {
    //为空的Cursor
    return;
    }

    (2)获取列值

    *获取单个的列值
    //获取列名为name的列索引
    int nameColumnIndex = cur.getColumnIndex(People.NAME);
    //由列索引获取姓名
    String name = cur.getString(nameColumnIndex);
    
    
    *循环 Cursor 取出我们需要的数据
    while(cur.moveToNext()) {
        //光标移动成功
       String email = cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL));
       startManagingCursor(cursor);  //查找后关闭游标 
       //把数据取出
    }

    cur.moveToNext() 为假时将跳出循环,即 Cursor 数据循环完毕

    3.补充

    Activity.startManagingCursor方法:

    将获得的Cursor对象交与Activity管理,这样Cursor对象的生命周期便能与当前的Activity自动同步,省去了自己对Cursor的管理

    1.这个方法使用的前提是游标结果集里有很多的数据记录

    所以,在使用之前,先对Cursor是否为null进行判断,如果Cursor != null,再使用此方法
    2.如果使用这个方法,最后也要用stopManagingCursor()来把它停止掉,以免出现错误。
    3.使用这个方法的目的是把获取的Cursor对象交给Activity管理,这样Cursor的生命周期便能和Activity自动同步,省去自己手动管理
    (绑定到ListView的Cursor必须有_id项,否则会有异常抛出)
    例:
    public void queryTheCursor(View view) {
    02
        Cursor c = mgr.queryTheCursor();
    03
        startManagingCursor(c); //托付给activity根据自己的生命周期去管理Cursor的生命周期
    04
        CursorWrapper cursorWrapper = new CursorWrapper(c) {
    05
            @Override
    06
            public String getString(int columnIndex) {
    07
                //将简介前加上年龄
    08
                if (getColumnName(columnIndex).equals("info")) {
    09
                    int age = getInt(getColumnIndex("age"));
    10
                    return age + " years old, " + super.getString(columnIndex);
    11
                }
    12
                return super.getString(columnIndex);
    13
            }
    14
        };
    15
        //确保查询结果中有"_id"列
    16
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
    17
                cursorWrapper, new String[]{"name", "info"}, new int[]{android.R.id.text1, android.R.id.text2});
    18
        ListView listView = (ListView) findViewById(R.id.listView_db);
    19
        listView.setAdapter(adapter);
    20
    }

    4.补充2  SimpleCursorAdapter

    (转http://www.nowamagic.net/academy/detail/50350111)

    一般在做网页的时候,要显示一个列表的数据,一般是对一个list的类进行循环,输出一大串的HTML字符串。数据比较多的话就会分页,比如一页10条记录,去数据库查询的时候就会limit 10条记录,速度非常快。

    但在 Android中遇到几千条数据的时候,上下滑动,跟几十条数据的滑动流畅程度差不多,就是刚开始载入速度不一样。对Android 中的Adapter 数据绑定,进行Log输出后,发现是边滑动,数据边绑定的,并不是有多少数据一次性绑定完。但是数据一般是用sql 语句一次性查询出来,这点跟Web中的还是有点区别。

    Android中ListView一般跟Cursor和Adapter有关。很多东西google都帮你弄好了,你只需要按照它约定的弄就行了。“你动不了Application Framework 的大结构,也不需要动。这是福利不是约束”

    SimpleCursorAdapter 的函数定义是:

    SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)

    第二个layout的参数是ListView中单行的布局, c是你数据的游标。刚开始其实from和to比较让人不熟悉,From是你查询出的数据,to是单行布局中的单独控件,一对一的关系,用起来非常方便。比如:

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.provice_list_item, cursor,
        new String[] {Location.PROVICE, Location.CITY },
        new int[] { R.id.princeTextView,android.R.id.text1 });

    写好Adapter,基本上大部分工作已经完成,只需要给你的listview设置这个adapter就行了。一个显示数据的列表就完成了。

    需要注意的是SimpleCursorAdapter的应用,当我们使用这个适配器时,我们必须先得到一个Cursor对象,这里面有几个问题:如何管理Cursor的生命周期,如果包装Cursor,Cursor结果集都需要注意什么。

    如果手动去管理Cursor的话会非常的麻烦,还有一定的风险,处理不当的话运行期间就会出现异常,幸好Activity为我们提供了startManagingCursor(Cursor cursor)方法,它会根据Activity的生命周期去管理当前的Cursor对象。

    startManagingCursor

    下面是 startManagingCursor 方法的说明:

    文中提到,startManagingCursor方法会根据Activity的生命周期去管理当前的Cursor对象的生命周期,就是说(1)当Activity停止时他会自动调用Cursor的deactivate方法,禁用游标,(2)当Activity重新回到屏幕时它会调用Cursor的requery方法再次查询,(3)当Activity摧毁时,被管理的Cursor都会自动关闭释放

    如何包装Cursor?我们会使用到CursorWrapper对象去包装我们的Cursor对象,实现我们需要的数据转换工作,这个CursorWrapper实际上是实现了Cursor接口。我们查询获取到的Cursor其实是Cursor的引用,而系统实际返回给我们的必然是Cursor接口的一个实现类的对象实例,我们用CursorWrapper包装这个实例,然后再使用SimpleCursorAdapter将结果显示到列表上

    Cursor结果集需要注意些什么:一个最需要注意的是,在我们的结果集中必须要包含一个“_id”的列,否则SimpleCursorAdapter就会翻脸不认人,为什么一定要这样呢?因为这源于SQLite的规范,主键以“_id”为标准

    解决办法有三:

    • 第一,建表时根据规范去做;
    • 第二,查询时用别名,例如:SELECT id AS _id FROM person;
    • 第三,在CursorWrapper里做文章:

    如果试图从CursorWrapper里获取“_id”对应的列索引,我们就返回查询结果里“id”对应的列索引即可。

     
  • 相关阅读:
    【BZOJ1014】【JSOI2008】火星人prefix
    [agc011e]increasing numbers
    NOIp2018模拟赛四十一
    拉格朗日插值&&快速插值
    NOIp2018模拟赛四十
    (2016北京集训十四)【xsy1557】task
    (2016北京集训十四)【xsy1556】股神小D
    数据泵导入ORA-39082报错解决
    OracleDBA职责—备份与恢复技术—概念
    OracleDBA职责—备份与恢复技术—RMAN3
  • 原文地址:https://www.cnblogs.com/alwayswyy/p/4807248.html
Copyright © 2011-2022 走看看