Android数据库进阶-从SQLite到ORMLite封装

本文介绍了Android开发中从SQLite到ORM框架的转变,特别是使用ORMLite进行数据库操作的基础和封装过程。作者详细阐述了ORMLite的引入、使用步骤、基础操作,以及如何通过封装解决数据库操作中的问题,包括统一增删改查、表管理、数据库助手类整合到数据管理模块,并结合Dagger2实现全局数据库对象管理。
摘要由CSDN通过智能技术生成

项目代码:
CameloeAnthony/Ant
博客原地址:Android数据库进阶-从SQLite到ORMLite封装

前言

几乎每一个android项目中,都必不可少的会使用数据库的操作。在此之前我曾写过一篇文章Rxjava+数据库?来用用SqlBrite和SqlDelight吧! ,SqlBrite是对 Android 系统的 SQLiteOpenHelper 的封装,对SQL操作引入了响应式语义 (Rx)(用来在 RxJava 中使用)。在那之后确实也使用过一段时间的SqlBrite,不过可能是本人能力原因 ,在我的业务开发中,SqlBrite使用起来也并没有多么的方便 ,反而对整体的封装起到了一定的阻碍。所以后来也就继续回归使用ORMLite做数据库操作。下面文章还是从基础到封装再到实例讲讲我的项目中的ORMLite是怎么使用的吧。


ORMLite的引入

1 从SQLite到ORM

SQLite是在世界上使用的最多的数据库引擎,并且还是开源的。它实现了无配置,无服务要求的事务数据库引擎。SQLite可以在Mac OS-X, iOS, Android, Linux, 和 Windows上使用。android中使用的正是SQLite。在Android开发中,使用SQLite作为基础部分,想必大家对继承 SQLiteOpenHelper 创建数据库,调用 SQLiteDatabase 的 execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据,不管你如何执行查询都会返回一个Android 的 SQLite 数据库游标……这一系列概念并不陌生啊 。想必很多人都和我一样,并不想写任何SQL语句,因为一不小心就写错了,而且各种重复的SQL语句写着真的心烦,大大的影响了开发的效率。

我们当然希望不需要再去和复杂的SQL语句打交道,在面向对象的编程中只要像平时操作对象一样操作它就可以了。这就引入了ORM。

ORM是对象关系映射(Object Relational Mapping)的缩写,对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据,ORM实现了对象和关系数据库之间的转换

2 java中ORM的原理

要实现JavaBean的属性到数据库表的字段的映射,任何ORM框架不外乎是读某个配置文件把JavaBean的属性和数据库表的字段自动关联起来,当从数据库Query时,自动把字段的值塞进JavaBean的对应属性里,当做INSERT或UPDATE时,自动把 JavaBean的属性值绑定到SQL语句中。

3 从ORM到ORMLite

ORM框架广泛引用于各种语言中,对于java开发者比较熟悉的有HibernateOrmlite等,Ormlite作为一个Java ORM。支持JDBC连接,Spring以及Android平台。除此之外Android中使用的ORM框架还有GreendaoActiveAndroidSugarORM, Realm等。后续项目会考虑使用 Realm,到时候再进行讲解。


ORMLite基础

ORMLite provides a lightweight Object Relational Mapping between Java classes and SQL databases. There are certainly more mature ORMs which provide this functionality including Hibernate and iBatis. However, the author wanted a simple yet powerful wrapper around the JDBC functions, and Hibernate and iBatis are significantly more complicated with many dependencies.

ORMLite 提供了一个轻量级的java对象和数据库的对象关系操作,相比于Hibernate 和iBatis 等成熟的ORM框架的繁重,ORMLite旨在提供一个简单而有效的解决方案。

当然和之前的所有文章一样, 基础部分都回归官方文档。这里会对android使用中的重点的基础部分进行提及并对官网的例子做出改动。官方文档中关于android的使用部分,请点击这里

首先看看封装之前的ORMLite在我项目中的使用步骤:

1 下载ORMLite的jar包

首先去http://ormlite.com/releases/ 下载jar包,对于Android目前版本为:ormlite-android-5.0.jar 和 ormlite-core-5.0.jar ;在我项目中添加的是之前的4.49的jar包。

2 创建实体类,这里利用新闻信息实体NewsItem类
@DatabaseTable(tableName = "tb_news_item")
public class NewsItem implements Serializable{
   
    @DatabaseField(generatedId = true, columnName = "i_id")
    private int i_id;

    @DatabaseField(columnName = "channelId")
    @SerializedName(value = "channelId")
    private int channelId;

    @DatabaseField(columnName = "id")
    @SerializedName(value = "id", alternate = {
  "docid", "docId"})
    private int id;


    @DatabaseField(columnName = "title")
    @SerializedName(value = "MetaDataTitle", alternate = {
  "title", "name"})
    private String title;


    @DatabaseField(columnName = "content")
    @SerializedName(value = "content"
一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值