之前做一个考试的项目,有个需求是 点击考试按钮进入考试,然后查询数据库获取题目,数据库是本地已经有的,由于我用的是 LitePal, 刚接触这个不知道怎么查询到外部的数据库。然后苦思了几天(由于还比较菜,请原谅我的效率)解决了这个问题。
以下是解决思路:
LitePal 的使用方法就不说了,网上找一大堆,这里是先在本地创建一个同样名字(不同名也行)的数据库,把需要用到的表创建出来。
怎么创建就不把代码贴出来了,直接上有用的代码:
- public class DBHelper {
- Context context;
- private SQLiteDatabase db;
- //数据库的名称
- private String DB_NAME = "title.db";
- //数据库的地址
- private String DB_PATH = "/data/data/包名/databases/";
- public DBHelper(Context context) {
- this.context = context;
- initFile();
- db = SQLiteDatabase.openDatabase("/data/data/包名/databases/title.db", null, SQLiteDatabase.OPEN_READWRITE);
- DataSupport.saveAll(dbHelper.getPDQuestion()); //把查到的数据保存到LitePal中,方便使用查询
- }
- // 获取数据库中的表(这里只写入了一张表)
- public List < PDSubject > getPDQuestion() {
- List < PDSubject > list = new ArrayList < >();
- //执行sql语句
- Cursor cursor = db.rawQuery("select * from PDTest", null);
- if (cursor.getCount() > 0) {
- cursor.moveToFirst();
- int count = cursor.getCount();
- //遍历
- for (int i = 0; i < count; i++) {
- cursor.moveToPosition(i);
- PDSubject pdBean = new PDSubject();
- pdBean.setMain_title(cursor.getString(cursor.getColumnIndex("MainTitle"))); //题目内容
- pdBean.setA(cursor.getString(cursor.getColumnIndex("A"))); //A答案
- pdBean.setB(cursor.getString(cursor.getColumnIndex("B"))); //B答案
- pdBean.setAnswer(cursor.getString(cursor.getColumnIndex("Answer"))); //正确答案
- pdBean.setMain_title_len(cursor.getInt(cursor.getColumnIndex("MaintitleLen"))); //题目的长度
- list.add(pdBean);
- }
- }
- return list;
- }
- private void initFile() {
- //判断数据库是否拷贝到相应的目录下
- if (new File(DB_PATH + DB_NAME).exists() == false) {
- File dir = new File(DB_PATH);
- if (!dir.exists()) {
- dir.mkdir();
- }
- //复制文件
- try {
- InputStream is = context.getAssets().open(DB_NAME);
- OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
- byte[] buffer = new byte[1024]; //用来复制文件
- int length; //保存已经复制的长度
- //开始复制
- while ((length = is.read(buffer)) > 0) {
- os.write(buffer, 0, length);
- }
- //刷新
- os.flush();
- //关闭
- os.close();
- is.close();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
创建一个 DBHelper 类把 assets 文件夹下的数据库文件写入到系统默认的 database 文件夹下,然后通过查询当前数据库把数据放入 List 中。
然后再程序的首个 activity 或 Application 中执行 DBHelper 的构造方法
这里我只复制了一张表,可以用同样的方法把所有表写入进去(有点麻烦,而且这样在你的程序中应该就会有三个一样数据库了。。。但是暂时我还没想到有什么别的方法)
执行完上面的代码后就可以用 LitePal 的查询方法了
- PDSubject dest = DataSupport.findFirst(PDSubject.class);
好了,大功告成!!!
来源: http://www.jianshu.com/p/06d553a3d68a