zoukankan      html  css  js  c++  java
  • GreenDao操作本地db文件(使用greendao 新版3.2.2 )

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





  • 相关阅读:
    jQuery命名空间,自定义空间及属性,插件开发全解析 (转)
    打印输入表单中的内容
    js 网页烟花效果
    js学习cookie封装之获取
    js学习cookie封装之添加
    git基本使用
    最简单的手风琴效果
    js学习cookie封装之删除
    21个值得收藏的javas技巧
    javascript常用特效汇总
  • 原文地址:https://www.cnblogs.com/donghaifeng-2016/p/6934843.html
Copyright © 2011-2022 走看看