Android 使用greenDAO 3.2.2 操作外部数据库
项目开发中有时需要用到一些写死的数据,如公司的产品信息之类的。这就需要我们先把数据库文件保存在资源文件夹下,然后当应用创建时将数据库文件拷到应用安装目录的/databases/文件夹下,然后再对数据进行操作。
本篇文章参考了【Android】GreenDao操作外部DB数据库文件—-寒小枫
使用greenDAO操作数据库能够省去自己去写SQLite语句的繁琐,提高效率。greenDAO默认保存数据库的地址也是在应用安装目录的/databases/文件夹下。
拷贝文件
拷贝文件就是将数据库文件拷到应用安装目录的/databases/文件夹下
//数据库文件路径 private static final String DB_PATH = "/data/data/包名/databases/"; //数据库文件名 private static final String DB_NAME = "dbname.db"; /** * 将assets文件夹下文件拷贝到/databases/下 * @param context * @param db_name */ public static void copyDbFile(Context context, String db_name) { InputStream in = null; FileOutputStream out = null; String path = "/data/data/" + context.getPackageName() + "/databases/"; File file = new File(path + db_name); //创建文件夹 File filePath = new File(path); if (!filePath.exists()) filePath.mkdirs(); if (file.exists()) return; try { in = context.getAssets().open(db_name); // 从assets目录下复制 out = new FileOutputStream(file); int length = -1; byte[] buf = new byte[1024]; while ((length = in.read(buf)) != -1) { out.write(buf, 0, length); } out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); if (out != null) out.close(); } catch (IOException e1) { e1.printStackTrace(); } } }
导入greenDAO依赖库
// project级builde.gradle文件中 buildscript { repositories { jcenter() mavenCentral() // add repository } dependencies { classpath 'com.android.tools.build:gradle:2.3.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin } } // module级builde.gradle文件中 apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao' // apply plugin dependencies { compile 'org.greenrobot:greendao:3.2.2' // add library }
配置路径
//module级builde.gradle文件中 greendao { schemaVersion 1 daoPackage '包名.gen' targetGenDir 'src/main/java' }
创建一个实体类
* 注意: *
* 因为导入的是已经创建好表的数据库,所以要在类前注解:@Entity(nameInDb = "productinfo",createInDb = false)
,其中nameInDb = "tablename"
是声明表名,不作此声明greenDAO默认操作的是库名的同名的表;另一句createInDb = false
是声明不再创建这个表,如果不这样声明greenDAO就会在UserDao文件中加入createTable方法,继而创建一个名叫tablename的同名表,然后就会出现table already exists的错误。
- 每个变量前的
@Property(nameInDb = "_id")
注解是为了让变量名能够指向列名,如果表中的一列是Name,而实体类中的属性是name,则在greenDAO编译后会创建
public final static Property Ear = new Property(2, String.class, "name", false, "NAME");
参数分别是(列号,数据类型,变量名,是否是主键,列名),这里的列名默认是变量名的大写形式,与表中的列名有了偏差,执行SQLite语句时就会出现no such columns的错误。
@Entity(nameInDb = "tablename",createInDb = false) public class User{ @Property(nameInDb = "_id") @Id (autoincrement = true) private long id; @Property(nameInDb = "Name") private int name; @Property(nameInDb = "Ear") private String ear; }
创建完后要Make Project一次。
操作数据表
一切准备就绪后就是操作数据表了,首先要获得数据表的操作对象
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "dbname.db"); Database db = helper.getWritableDb(); DaoSession daoSession = new DaoMaster(db).newSession(); ProductDao dao = daoSession.getProductDao();
之后就能进行各种操作了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
2016-07-11 【Java线程】Java线程池ExecutorService
2016-07-11 MappedByteBuffer高速缓存文件、RandomAccessFile随机访问
2016-07-11 RandomAccessFile和memory-mapped files
2016-07-11 花1K内存实现高效I/O的RandomAccessFile类
2016-07-11 java中利用RandomAccessFile读取超大文件
2016-07-11 android 多线程断点续传下载
2016-07-11 android 多线程断点续传下载 三