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