項目需求:省市區使用本地db文件,數據庫使用greendao框架。現在不想使用SQL語句,用greendao直接查詢本地數據庫表(至於為啥使用GreenDao,可以百度一下它的優勢)。
https://github.com/HeavenDong/MyDBControl/tree/master
思路: 1、將db文件copy到數據庫默認目錄下
/data/data/你的項目包名/databases/表名(與greendao生成的表相同)
2、greendao生成對應表的實體、Dao文件,使用greendao封裝的方法操作已copy過來的數據庫表。
遇到的問題:
1、android.database.sqlite.SQLiteException: table 'TB_CITY' already exists (code 1): ,
看報錯說表TB_CITY已存在,再次創建它時報數據庫異常。
原因:你可以查看生成的DaoMaster,createAllTables(db,false)。第二個參數,默認為false(創建表)



解決方法:greendao3.2.2的使用中,生成實體 使用注解@Entity( createInDb=false)// createInDb 是否創建表,默認true。如像本項目中,表已經copy生成,不需要創建,設為false。
DaoMaster中createAllTable(db,參數),參數是默認生成的,不可改(老版的可以修改,不過真心感覺新版本greendao好用。)。
2、android.database.sqlite.SQLiteException: no such column: T.PROVINCE_ID (code 1): ,
原因:創建實體時字段名與db文件的字段沒有對應。
解決方法:對應你的db文件,檢查修改字段,類型。
項目使用流程:(greendao3.2 的使用流程網上有很多,按步驟做就可以)。
http://blog.csdn.net/qq_30203943/article/details/56278435
數據庫copy方法:
private void copyDBToDatabases() {
String DB_PATH="/data/data/包名/databases/";
try {
String outFileName = DB_PATH + DB_NAME;
File file = new File(DB_PATH);
if (!file.mkdirs()) {
file.mkdirs();
}
File dataFile = new File(outFileName);
if (dataFile.exists()) {
dataFile.delete();
}
InputStream myInput;
myInput = this.getAssets().open(DB_NAME);
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
Log.d("haifeng", "copy db");
} catch (IOException e) {
Log.d("haifeng", "error " + e.toString());
e.printStackTrace();
}
}
Dao管理類:
/**
* Created by Administrator on 2017/6/5.
*/
public class GreenDaoManager {
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private static GreenDaoManager mInstance;
//單例
public static GreenDaoManager getInstance(){
if (mInstance==null){
//保證異步處理安全操作
synchronized (GreenDaoManager.class){
if (mInstance==null){
mInstance=new GreenDaoManager();
}
}
}
return mInstance;
}
private GreenDaoManager(){
if (mInstance==null){
DaoMaster.DevOpenHelper openHelper=new DaoMaster.DevOpenHelper(App.getInstance(),App.getInstance().DB_NAME,null);
mDaoMaster=new DaoMaster(openHelper.getWritableDatabase());
mDaoSession=mDaoMaster.newSession();
}
}
public DaoMaster getMaster(){
return mDaoMaster;
}
public DaoSession getSession(){
return mDaoSession;
}
public DaoSession getNewSession(){
mDaoSession=mDaoMaster.newSession();
return mDaoSession;
}
}
調用:
//查詢省的表
tb_provinceDao provinceEntityDao= GreenDaoManager.getInstance().getSession().getTb_provinceDao();
List<tb_province> list= provinceEntityDao.loadAll();
if (list.size()>0) {
for (int i = 0; i < 3; i++) {
Toast.makeText(App.getInstance(),
"省id:" + list.get(i).getProvinceid()
+ ";省名字:" + list.get(i).getProvincename()
+ ";市id:" + list.get(i).getCountryid()
, Toast.LENGTH_SHORT).show();
}
}
