项目需求:省市区使用本地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();
}
}



最新文章

  1. Centos6.5入侵清理
  2. 如何查看LINUX 硬件配置信息
  3. xshell 远程连接Linux
  4. Servlet入门案例
  5. python之PIL安装问题
  6. c++通过jnihelper调用java方法刷新androidUI的注意事项
  7. WPF TextSelection获取选中部分内容
  8. 【高级算法】模拟退火算法解决3SAT问题(C++实现)
  9. 使用Python管理Azure(1):基础配置
  10. Cocos2d-x 3.0 红孩儿私人义务教育 - 第一章 熟人Cocos2d-x 3.0project
  11. Sql Sever语句 (续2)
  12. git和github的重要性
  13. C# 在PPT中绘制形状(shape)
  14. solr入门
  15. 【PyQt5-Qt Designer】在GUI中使用pyqtgraph绘图库
  16. python操作Exchange邮箱实例(-)
  17. 【Ansible】ansible循环
  18. 20145226夏艺华 《Java程序设计》实验报告五
  19. c语言----程序记录
  20. 让输入的字符转义成html实体的方法

热门文章

  1. Android:Fragment
  2. LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
  3. 测开-面试题-OS、Linux、算法、其他
  4. C++实现顺序栈相关操作代码
  5. replace 常用积累
  6. SQL Server查看端口号及修改端口号
  7. springboot配置ssl变成https证书
  8. Django 初步运行过程分析笔记
  9. version libcrypto.so.10 not defined in file libcrypto.so.10 with link time reference
  10. .net core 添加省市区三级联动以及编辑时显示选中的城市。