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”对应的列索引即可。

     
  • 相关阅读:
    JavaScript模态对话框类
    事件模块的演变(1)
    html5中可通过document.head获取head元素
    How to search for just a specific file type in Visual Studio code?
    What do 'lazy' and 'greedy' mean in the context of regular expressions?
    正则非获取匹配 Lookahead and Lookbehind ZeroLength Assertions
    regex length 正则长度问题
    Inversion of Control vs Dependency Injection
    How to return View with QueryString in ASP.NET MVC 2?
    今天才发现Google Reader
  • 原文地址:https://www.cnblogs.com/alwayswyy/p/4807248.html
Copyright © 2011-2022 走看看