前言:关于安卓数据库的基本操作这里不再赘述,我们来看一下如何使用分页查询数据,然后用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的位置:
数据库位置: