Android开发之数据库的分页查询

前言:关于安卓数据库的基本操作这里不再赘述,我们来看一下如何使用分页查询数据,然后用RecyclerView显示到屏幕上。其中里面有需要注意的小细节,我会一一向大家介绍一下。

--------------------分割线------------------

需要用到的数据库分页查询语句(这里默认一次查询20条数据):

database.rawQuery("select name,number from number order by _id desc limit ?,20", new String[]{index + ""});

获取数据库中数据的总个数:

database.rawQuery("select count(*) from number", null);

-------------------分割线------------------

思路:

1.首先我们先要添加50条数据,供我们分页查询:

 public void click1(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    mDao.add("fly" + i, (100 + i) + "");
                }
            }
        }).start();
        mAdapter.notifyDataSetChanged();
    }

2.开启查询,这个开始查询默认是只能查询20条数据,也就是只能显示20条数据,所以在继续往下查询的时候需要在原有的集合上添加上去。

 private void initData() {
  
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);// 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // mList = mDao.findAll();
                if (mList == null) {// 第一页数据
                    mList = mDao.findPart(mIndex);// 查询一页数据
                } else {
                    // 在原有集合上追加20条数据
                    ArrayList<NumberInfo> partList = mDao.findPart(mIndex);// 查询下一页数据
                    // 1,2,3,4,5 , + 6,7,8,9
                    mList.addAll(partList);
                }

                // 运行在主线程
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        if (mAdapter == null) {// 第一页数据,才初始化adapter
                            mAdapter = new MyAdapter(MainActivity.this, mList);
                            mRecyclerView.setAdapter(mAdapter);// 给listview设置数据,数据从第0个开始展示
                        } else {
                            // 刷新listview
                            mAdapter.notifyDataSetChanged();// 基于当前数据,进行刷新操作,当前在哪个item,就展现在哪个item
                        }

                        // mIndex += 20;
                        // 20, 40, 60, 80
                        mIndex = mList.size();// 更新分页位置
                    }
                });
            }
        }.start();

3.我们可以在滑动RecyclerView的时候继续分页读取下一个20条数据,同时也要判断是否数据获取完了。

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == SCROLL_STATE_IDLE) {// 滑动空闲
                    // 判断是否到底部
                    // 判断当前屏幕展示的最后一个条目是否是集合中最后一个元素,如果是,就到底部了
                    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                    //判断是当前layoutManager是否为LinearLayoutManager
                    // 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
                    if (layoutManager instanceof LinearLayoutManager) {
                        LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
                        //获取最后一个可见view的位置
                        int lastVisiblePosition = linearManager.findLastVisibleItemPosition();
                        if (lastVisiblePosition >= mList.size() - 1 && !isLoading) {
                            System.out.println("到底了...");
                            // 判断是否到最后一页
                            // 获取数据库数据的总个数, 和当前集合中的个数进行对比
                            int totalCount = mDao.getTotalCount();
                            if (mList.size() < totalCount) {
                                initData();
                            } else {
                                Toast.makeText(MainActivity.this, "没有更多数据了", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }

                }
            }
        });
注意:关于RecyclerView里面获取item的位置,或者获取最后一个item的位置等等,方法在layoutManager里面这点和listView不太一样,希望大家注意。下面我总结了一下几个常用的api。
canScrollHorizontally();//能否横向滚动 
canScrollVertically();//能否纵向滚动 
scrollToPosition(int position);//滚动到指定位置 
setOrientation(intorientation);//设置滚动的方向 
getOrientation();//获取滚动方向 
findViewByPosition(int position);//获取指定位置的
Item View findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置 
findFirstVisibleItemPosition();//获取第一个可见Item的位置 
findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置 
findLastVisibleItemPosition();//获取最后一个可见Item的位置

-------------------------分割线-------------------------

关于数据库操作的几个方法:

获取总个数:

    public int getTotalCount() {
        SQLiteDatabase database = mHelper.getWritableDatabase();
        Cursor cursor = database.rawQuery("select count(*) from number", null);
        int count = -1;
        if (cursor.moveToFirst()) {
            count = cursor.getInt(0);
        }
        cursor.close();
        database.close();
        return count;
    }

分页查询:

    public ArrayList<NumberInfo> findPart(int index) {
        SQLiteDatabase database = mHelper.getWritableDatabase();
        Cursor cursor = database.rawQuery("select name,number from number order by _id desc limit ?,20", 
                new String[]{index + ""});// 分页查询20条数据,逆序排列,最后添加的展示在最上面
        ArrayList<NumberInfo> list = new ArrayList<NumberInfo>();
        while (cursor.moveToNext()) {
            NumberInfo info = new NumberInfo();
            String name = cursor.getString(0);
            String number = cursor.getString(1);
            info.name = name;
            info.number = number;
            list.add(info);
        }
        cursor.close();
        database.close();
        return list;
    }

---------------------数据库操作的细节---------------------

关于数据库操作我想说的几点:

1.数据库的增删改产的Dao类,要使用单例模式。

2.查询数据库的数据比较多的时候要使用javaBean,保存在ArraList中,避免频繁查询数据库

3.只要我们查询数据库的数量多的时候,我们要开启线程,避免卡顿或者程序异常。

4.关于数据库的删除数据的时候,既然我们保存在了集合中去,在删除数据的时候,也要从集合中移除,然后刷新adapter。添加也使用同样方法!

------在模拟器上如何查看自己创建的数据库---------

在目录data->data->安装目录->databases->数据库名字.db

下面是我截的图:

Device Monitor的位置:

数据库位置:




-----------------代码下载-------------------

完整代码下载:Android开发之数据库的分页查询代码

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值