项目需求:省市区使用本地db文件,数据库使用greendao框架。现在不想使用SQL语句,用greendao直接查询本地数据库表(至于为啥使用GreenDao,可以百度一下它的优势)。
思路: 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,参数),参数是默认生成的,不可改。
2、android.database.sqlite.SQLiteException: no such column: T.PROVINCE_ID (code 1): ,
原因:创建实体时字段名与db文件的字段没有对应。 解决方法:检查修改字段,类型。 项目使用流程:(greendao3.2 的使用流程网上有很多,按步骤做就可以)。 数据库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(); }}
时间: 2024-10-29 04:47:28