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();
}
}
GreenDao操作本地db文件(使用greendao 新版3.2.2 )的更多相关文章
- Android GreenDao操作外部DB数据库文件
1.背景 所谓外部数据库文件此处指的就是一个在外部单独创建的db文件,假设有这么一个场景,我们项目中有一些本地数据,不需要接口去获取的(不需要进行网络操作),写死的数据,比如全国各个省各个市的一些基本 ...
- 【原】使用SQLite打开本地*.db文件
1.下载安装文件:官网下载地址:http://www.sqlite.org/download.html32位安装包:http://www.sqlite.org/2016/sqlite-tools-wi ...
- python打开一个本地目录文件路径
os.path.abspath()os 模块为 python 语言标准库中的 os 模块包含普遍的操作系统功能.主要用于操作本地目录文件.path.abspath()方法用于获取当前路径下的文件. 比 ...
- [Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类
继续接上文: Android 使用 Greendao 操作 db sqlite(1)-- 直接在MainActivity中调用 布局文件同上文一致,这里就不贴了. 一.封装DaoUtils类 User ...
- [Android] Android 使用 Greendao 操作 db sqlite(1)-- 直接在MainActivity中调用
继续接上文: Android 使用 Greendao 操作 db sqlite 布局文件: activity_test_green.xml <?xml version="1.0&quo ...
- [Android] Android 使用 Greendao 操作 db sqlite
Android 使用 Greendao 操作 db sqlite GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣.它减轻开发人员处理低级数据库需求,同时节省开发 ...
- greendao操作数据库的使用方法
第一步:把greendao-1.3.0-beta-1,greendao-generator-1.3.1两个jar包加载到工程的lib的文件夹中,一定要右键点击Add As Library后才能使用. ...
- android数据库操作之直接读取db文件
在对数据库操作时,常用的有两种方法: 1.在代码中建库.建表: 2.直接将相关库.表建立好,将db文件拷贝至assets目录下: 现在来看看第二种方法: private String Ge ...
- Oracle 导入本地dmp文件 详细操作步骤
以下操作均在命令行窗口中进行 /*连接数据库*/ C:\Users\hqbhonker>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Prod ...
- 对SQLite数据库操作 操作db文件
sqlite数据库就是一个DB文件. 程序每操作一次数据库都要读一次 .DB 文件 . 这个文件就是这个SQLite数据库. 如果需要依赖包的可以联系我 工具类: package com.hot ...
随机推荐
- STM32L431 移植 LiteOS 时 _ebss _Min_Heap_Size _Min_Stack_Size 未找到或未定义
将 LiteOS 移植完成之后,编译报如下错误: 环境 版本 Keil V5.37.0.0 Windows11 2022/12/22 ARM::CMSIS 5.9(2022-05-22) 开发板 ST ...
- centos7 安装MariaDB数据库
1.添加 MariaDB yum源 #添加MariaDB.repo配置文件 vim /etc/yum.repos.d/MariaDB.repo #添加内容 [mariadb] name = Maria ...
- asp多模块功能代码,单调用插入的case方法
function getmodule(arg) select case arg case "pinyin" aaa="123" %><!--#插入页 ...
- C语言实现链表的创建与遍历
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 typedef struct Node{ 6 int data; 7 stru ...
- windows10 远程桌面黑屏
[计算机配置]-[管理模板]-[Windows组件]-[远程桌面服务]-[远程桌面会话主机]-[远程会话环境]-{为远程桌面连接使用WDDM图形显示驱动程序-设置禁用}
- Day 13 13.2 requests之请求参数与请求体
请求参数与请求体参数 一.什么是params参数(请求参数) get 方法是可以向服务器发送信息的,除了可以请求需要的页面之外,也可以发送我们指定的内容,这就是通过 params 参数实现的 requ ...
- OOP学习讲义
什么是OOP 场景:我进入一家IT公司,面试官问道我这个问题.OOP?WTF?"众所周知,Java是一门面向对象的开发语言,所以OOP不就是面向对象设计咩.Java把所有的元素都当成是一个对 ...
- python中的上下文管理器以及python内建模块contextlib的contextmanager方法
上下文管理器 上下文管理器是实现了上下文管理协议的对象,其特有的语法是"with -as".主要用于保存和恢复各种全局状态,关闭文件等,并为try-except-finally提供 ...
- 阶梯场景jp@gc - Stepping Thread Group (deprecated)
1.新建线程,添加配置元件.监听器 由上可见: 需要启动100个线程, 然后间隔30s就持续5s去启动10个线程, 那么就需要这样重复操作10次,才能100个线程全部启动. 最后整体100个线程持续运 ...
- Unity 使用IO流获取PNG/JPG/GIF/BMP的宽高【转】
原文链接:https://blog.csdn.net/flj135792468/article/details/107963280?utm_medium=distribute.pc_relevant. ...