GreenDao操作本地db文件(使用greendao 新版3.2.2 )

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

GreenDao操作本地db文件(使用greendao 新版3.2.2 )的相关文章

【Android】GreenDao操作外部DB数据库文件

1.背景 所谓外部数据库文件此处指的就是一个在外部单独创建的db文件,假设有这么一个场景,我们项目中有一些本地数据,不需要接口去获取的(不需要进行网络操作),写死的数据,比如全国各个省各个市的一些基本信息,每个市的信息可以作为表里的一条记录存放,在项目中使用,此时如何我们已经有了包含这些信息的db文件,我们就可以通过greendao来操作这个db文件,更具方便进行开发工作,当然这只是个模拟情况,至于合不合理,有没有更好的方式,此处不过多讨论,重点讲这么一种方式,这种方式可以用于一些不经常变化的数

【原】使用SQLite打开本地*.db文件

1.下载安装文件:官网下载地址:http://www.sqlite.org/download.html32位安装包:http://www.sqlite.org/2016/sqlite-tools-win32-x86-3130000.zip64位补丁:http://www.sqlite.org/2016/sqlite-dll-win64-x64-3130000.zip 2.安装: 解压之后,将64位补丁包dll文件与exe文件放在相同目录下即可 3.使用:sqlite3 .exe 才438KB 

python打开一个本地目录文件路径

os.path.abspath()os 模块为 python 语言标准库中的 os 模块包含普遍的操作系统功能.主要用于操作本地目录文件.path.abspath()方法用于获取当前路径下的文件. 比如: file_path = 'file:///' + os.path.abspath('checkbox.html') driver.get(file_path)

[Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类1

[Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类 原文地址:https://www.cnblogs.com/wukong1688/p/10725092.html

【凯子哥带你做高仿】“煎蛋”Android版的高仿及优化(三)——使用GreenDao实现本地Sqlite缓存

到目前为止,煎蛋的Android项目算是告一段落了,功能基本都已完成,那么今天,我就介绍一下在煎蛋这个项目里,是怎么完成数据缓存功能的.想看代码的请戳煎蛋项目的GITHUB地址 转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 缓存功能的解决方案 配置GreenDao 实现缓存功能 其他资料 缓存功能的解决方案 因为算是一个阅读类的应用,所以说如果在无网络情况下,用户打开App还能看到内容的话,属于比较好的用户体验.那么,这就涉及到本地缓存了. 本地缓存

android数据库操作之直接读取db文件

在对数据库操作时,常用的有两种方法: 1.在代码中建库.建表: 2.直接将相关库.表建立好,将db文件拷贝至assets目录下: 现在来看看第二种方法: private String GetDataBasePath(Context context) { String packageName = context.getPackageName(); //Log.i("PackName", packageName); // String DB_PATH = String.format(&qu

新版vue获取本地json文件数据

现在升级后的vue没有dev-server.js和dev-client.js,可以通过以下方式模拟后台数据: 1.找到webpack.dev.conf.js这个文件,在const portfinder = require('portfinder')后面添加以下代码: 1 const express = require('express') 2 const app = express()//请求server 3 var appData = require('../data.json')//加载本地

UWP 读取本地XML文件

读取本地XML文件时要将xxx.xml文件的“生成操作”改为“嵌入的资源”会比较好,在手机上运行的话需要改为“内容” <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata

读取本地数据库文件

有时候我们可以将类似省份城市的数据库文件存放在assets/文件夹名/××.sql下,当程序在创建数据库时读取该数据库文件,并执行其内的sql语句 在SqLiteOpenHelper类的onCreate方法中调用 executeAssetsSQL(db, "××.sql"); /** * 读取数据库文件(.sql),并执行sql语句 * */ private void executeAssetsSQL(SQLiteDatabase db, String schemaName) { Bu