SQLite + ListView分页技术

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);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "CREATE TABLE question (" +
				"id			integer			primary key ," +
				"question	text			not null," +
				"answer		text			not null" +
				")" ;
		db.execSQL(sql);		
	}

	@Override
	public 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() {
			@Override
			public 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() {
			@Override
			public 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);
						}
					}
				}
			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				first = firstVisibleItem;
				visCount = visibleItemCount;
				total = totalItemCount;
			}
		});





























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值