SQLite + ListView分页技术
来源:互联网 发布:java中文模糊匹配算法 编辑:程序博客网 时间:2024/05/17 02:37
1、先建立一个数据库以及里面的表,用来保存问题以及答案
public class DataBaseConnection extends SQLiteOpenHelper {private static final int DBVERSION = 1;private static final String DBNAME = "question.db";public DataBaseConnection(Context ctx) {super(ctx, DBNAME, null, DBVERSION);}public DataBaseConnection(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE question (" +"idintegerprimary key ," +"questiontextnot null," +"answertextnot null" +")" ;db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}
完成数据库的添加和查询操作。
public class QuestionDAOUtils {public static void insertData(Map<String, Object> map) {String sql = "INSERT INTO question (question,answer) VALUES (?,?)";Globals.dbc.getWritableDatabase().execSQL(sql,new Object[] { map.get("question"), map.get("answer") });}public static List<Map<String, Object>> listData() {List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>();String sql = "SELECT id,question,answer FROM question";Cursor c = Globals.dbc.getReadableDatabase().rawQuery(sql, null);c.moveToFirst();while (!c.isAfterLast()) {Map<String, Object> map = new HashMap<String, Object>();map.put("question", c.getString(0));map.put("answer", c.getString(1));allValues.add(map);c.moveToNext();}c.close();return allValues;}}
在Globals的init方法中,初始化好数据库连接对象
public class Globals {public static DataBaseConnection dbc;public static void init(Activity a) {dbc = new DataBaseConnection(a);}}
在IndexActivity中就可以将读取到的所有问题和答案保存到数据库里。
为了防止用户重复的添加数据,这里需要保存一个标志位
public static void deleteAllData() {String sql = "DELETE FROM question";Globals.dbc.getWritableDatabase().execSQL(sql);}
2、SharedPreferences
这个类可以在程序中临时保存变量,该变量会长期保存到某个xml文件中,使用时直接读取即可。
// 加入定时切换界面功能Thread t = new Thread() {@Overridepublic void run() {// 定时try {// 从SharedPreferences中读取一个标志位SharedPreferences s = getSharedPreferences("question_flag",MODE_PRIVATE);boolean savedFlag = s.getBoolean("flag", false);if (savedFlag) {// 之前保存过了,睡2秒后再跳转Thread.sleep(2000);} else {// 之前没保存过,或没保存好,需要重新保存数据// 先删除QuestionDAOUtils.deleteAllData();// 读取数据try {InputStream is = getAssets().open("question.txt");BufferedReader reader = new BufferedReader(new InputStreamReader(is, "GBK"));String line = null;StringBuilder question = new StringBuilder();StringBuilder answer = new StringBuilder();// 标志, 标识当前读入的是问题还是答案boolean questionFlag = false;while ((line = reader.readLine()) != null) {// 判断读入的是什么if ("QUESTION_START_FLAG".equals(line)) {// 下面需要读入问题questionFlag = true;} else if ("ANSWER_START_FLAG".equals(line)) {// 下面需要读入答案questionFlag = false;} else if ("END_FLAG".equals(line)) {// 将数据保存到数据库中// 需要建立一个Map,保存问题与答案Map<String, Object> map = new HashMap<String, Object>();map.put("question",question.substring(0,question.length() - 2));map.put("answer", answer.substring(0,answer.length() - 2));QuestionDAOUtils.insertData(map);// 将问题和答案的Builder清空,以便保存新的内容.question = new StringBuilder();answer = new StringBuilder();} else {// 读入的是数据,需要加入到问题或答案中if (questionFlag) {question.append(line + "\r\n");} else {answer.append(line + "\r\n");}}}// 存一个标志,下次就不需要再重新保存数据了Editor e = s.edit();e.putBoolean("flag", true);// 提交e.commit();} catch (Exception e) {e.printStackTrace();}}// 切换下一个界面Intent in = new Intent(IndexActivity.this,MainActivity.class);startActivity(in);// 当切换到下一个界面后,当前封面就关闭了finish();} catch (Exception e) {e.printStackTrace();}}};t.start();
加入分页功能,在SQLite中分页语句使用LIMIT关键字即可实现
完成查询当前页数据,以及总记录数的方法。
public static List<Map<String, Object>> listDataPage(int pageNo,int pageSize) {List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>();String sql = "SELECT id,question,answer FROM question LIMIT ?,?";Cursor c = Globals.dbc.getReadableDatabase().rawQuery(sql,new String[] { (pageNo - 1) * pageSize + "", pageSize + "" });c.moveToFirst();while (!c.isAfterLast()) {Map<String, Object> map = new HashMap<String, Object>();map.put("id", c.getInt(0));map.put("question", c.getInt(0) + "、" + c.getString(1));map.put("answer", c.getString(2));allValues.add(map);c.moveToNext();}c.close();return allValues;}public static int getAllCount() {String sql = "SELECT COUNT(*) FROM question";Cursor c = Globals.dbc.getReadableDatabase().rawQuery(sql, null);c.moveToFirst();int count = c.getInt(0);c.close();return count;}
在QuestionListActivity中,分别调用这两个方法,来取得数据,先取得第一页的数据。
allValues = QuestionDAOUtils.listDataPage(pageNo, pageSize);// 查询记录数count = QuestionDAOUtils.getAllCount();加入滚动监听list.setOnScrollListener(new OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (scrollState == OnScrollListener.SCROLL_STATE_IDLE&& first + visCount == total && total != 0) {if (pageNo < allPages) {// 可以查询下一页数据pageNo++;// 将新查询的数据合并到原有的数据集合allValues.addAll(QuestionDAOUtils.listDataPage(pageNo,pageSize));// 通知adapter.notifyDataSetChanged();} else {// 已经查询了全部的数据,将footer删除if (list.getFooterViewsCount() > 0) {list.removeFooterView(footerText);}}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {first = firstVisibleItem;visCount = visibleItemCount;total = totalItemCount;}});
0 0
- SQLite + ListView分页技术
- ListView之分页技术
- Django中ListView分页技术
- android listview scroll滑屏显示sqlite分页,类似聊天记录,listview动态添加sqlite分页数据
- Sqlite数据库分页查询(ListView分页显示数据)
- SQLite和ListView的使用 并实现分页
- Android问题:listview和sqlite分页加载相关资源
- Sqlite分页
- Listview分页
- ListView分页
- listView分页
- ListView分页
- listview分页
- listview分页
- ListView分页
- ListView分页
- ListView分页
- ListView分页
- AMD编程手册小译
- MySQL架构探讨
- 给定数组,如何快速建立查找二叉树
- 从今天起开始学习intel汇编(三) 过程
- 重新安装mysql最后出现startService未响应解决方法
- SQLite + ListView分页技术
- Linux下软件发布技巧
- 功能设计源码以及思路-图片上传篇
- 转]linux中cut的使用
- 更改myeclipse默认工作空间
- HDU 1051 Wooden Sticks 排序+最长递增
- Android自定义View------指南针
- 免费软件如何赚钱?
- 解决QT中Warning中Wreorder