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