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();
    }
    }





  • 相关阅读:
    STM8s在利用库配置端口的小问题
    ABAP调试
    READ TABLE 的用法
    人在低谷
    力扣 两数之和
    未来选择
    选择
    室友问题该如何解决呢?
    力扣 两数之和
    谈谈自己
  • 原文地址:https://www.cnblogs.com/donghaifeng-2016/p/6934843.html
Copyright © 2011-2022 走看看