之前做一個考試的項目,有個需求是 點擊考試按鈕進入考試,然后查詢數據庫獲取題目,數據庫是本地已經有的,由于我用的是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);
好了,大功告成!!!