ANDROID数据库框架 ORMLITE轻量级的对象关系映射(ORM)JAVA包
对象关系模型的简称

对象关系模型(Object-Relational Model)1. 简介对象关系模型(Object-Relational Model,简称ORM)是一种用于描述和操作对象与关系数据库之间的映射关系的数据模型。
ORM将面向对象的思想与关系数据库的优势相结合,提供了一种便捷、高效的方式来处理数据持久化和查询。
2. ORM的特点2.1 面向对象思想ORM基于面向对象的思想,将现实世界中的概念抽象为对象,并通过类和继承等机制来组织和管理这些对象。
通过ORM,开发人员可以直接使用面向对象编程语言(如Java、Python)对数据库进行操作,无需编写复杂的SQL语句。
2.2 数据库无关性ORM提供了一种与具体数据库系统无关的抽象层,使开发人员能够在不同的数据库系统之间切换而无需修改代码。
ORM框架会根据配置文件或注解自动生成SQL语句,并将其转换为特定数据库系统所支持的语法。
2.3 映射关系管理ORM通过建立对象和表之间的映射关系,实现了对象到表、属性到列之间的映射。
开发人员只需定义好对象和表之间的映射规则,ORM框架便能自动处理对象和表之间的转换,无需手动编写转换代码。
2.4 数据一致性维护ORM框架提供了事务管理机制,保证对数据库的操作具有原子性、一致性、隔离性和持久性。
开发人员可以通过简单的API调用来管理事务,确保数据的完整性和一致性。
3. ORM框架目前市场上有许多成熟的ORM框架可供选择,如Hibernate、Django ORM、SQLAlchemy等。
这些框架提供了丰富的功能和灵活的配置选项,使开发人员能够更加高效地进行数据库操作。
3.1 HibernateHibernate是Java平台上广泛使用的ORM框架,它提供了强大的对象关系映射功能和事务管理机制。
开发人员可以通过注解或XML配置文件来定义对象与表之间的映射关系,并使用Hibernate提供的API进行数据持久化操作。
3.2 Django ORMDjango ORM是Python Web框架Django中集成的ORM工具。
ORM实现原理

ORM实现原理1.什么是ORMORM的全称是Object Relational Mapping,即对象关系映射。
它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发⼈员就可以把对数据库的操作转化为对这些对象的操作。
因此它的⽬的是为了⽅便开发⼈员以⾯向对象的思想来实现对数据库的操作。
2.什么是Hibernate对于Hibernate的称呼有很多,⽐如⼯具、技术、框架以及解决⽅案等,这些都可以,重要的是⼤家要知道它的作⽤。
在这⾥我习惯性称它为框架,它是⼀种能实现ORM的框架。
能实现ORM这个功能的框架有很多,Hibernate可以说是这些框架中最流⾏、最受开发者关注的,甚⾄连JBoss公司也把它吸收进来,利⽤它在⾃⼰的项⽬中实现ORM功能。
3.ORM的实现原理现在在Java领域⼤家对Hibernate的讨论很多,⽐如它的优缺点、如何应⽤、错误如何解决以及把它和Struts/Spring等框架相结合作为整个系统的解决⽅案。
在这⾥我想和⼤家探讨⼀些更深层次的话题,那就是Hibernate是如何实现ORM的功能?如果让我们⾃⼰开发⼀款实现ORM 功能的框架需要怎么做?其实这些问题就是围绕着⼀个词,那就是“映射”,如果我们知道如何实现这种映射那么我们也能够开发出⾃⼰的⼀款ORM框架。
会使⽤Hibernate的开发⼈员都知道,在使⽤它实现ORM功能的时候,主要的⽂件有:映射类(*.java)、映射⽂件(*.hbm.xml)以及数据库配置⽂件(*.properties或*.cfg.xml),它们各⾃的作⽤如下。
⑴映射类:它的作⽤是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象。
⑵映射⽂件:它的作⽤是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
⑶数据库配置⽂件:它的作⽤是指定与数据库连接时需要的连接信息,⽐如连接哪中数据库、登录⽤户名、登录密码以及连接字符串等。
android orik原理bean

android orik原理bean
ORIK是一种轻量级的ORM框架,在Android开发中被广泛使用。
它的主要功能是将Java/Kotlin对象映射到数据库表中,并且可以自动生成增删改查的操作。
ORIK核心原理是利用Java反射机制,将Java对象的属性映射到数据库表的列上。
同时,ORIK还支持自定义映射规则,并提供了注解方式来简化映射配置。
除此之外,ORIK还支持多种数据类型的映射,例如数字、日期、枚举等。
并且,它还支持级联操作和延迟加载,使得ORM操作更加方便和高效。
总之,Android ORIK原理Bean是理解ORIK框架的基础,掌握了ORIK的原理和机制,才能更好地使用ORM框架进行Android开发。
- 1 -。
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的,那也是比较老的逻辑了,后来我们准备重构项目的时候,我决定把数据库也重构一下,因为我们当时的应用读取速度来还是比较慢的,比如你有一两年的数据之类的,我后来就研究了一下这两个框架,虽然我最后采用的是GreenDao,但是ORMLite也是研究了一会儿,所以,接下来,我将把这两个框架分两篇文章来分析,首先就是ORMLite了,网上还是有很多关于他们的文章的,所以我也是准备站在巨人的肩膀上,首先他们之间的优缺点,也有前辈写了,你可以参考一下SQLite数据库框架ORMLite与GreenDao的简单比较而且鸿洋老师也写了两篇关于ORMLite的文章Android ORMLite 框架的入门用法Android 快速开发系列ORMLite 框架最佳实践但是就算他们写了,我觉得我再根据自己的逻辑去讲一遍,很多人还是会收益的,我自信我的文笔应该还是算不错的,而且我是基于Android studio来讲的。
嘻嘻,话不多说,我们来新建一个项目:一.准备工作在以前,我们写数据库时怎么写的?那就是频繁的去写SQLiteOpenHelper了,所以后来在我们开发中,很多人就喜欢封装他们,提高性能,也就出现了很多的数据库框架,ORMLite 算是一个佼佼者了们根据官方文档来看这个框架是怎么样集成的,官网上有共有四个步骤然后添加到libs目录下,然后右键——Add As Library就算是添加成功了,紧接着,我们在xml 中写个按钮用来创建表和保存数据<Buttonandroid:id="@+id/btn_create_save"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="创建表| 保存数据" />二.Bean类OK,我们继续看文档,他需要编写一个bean类来声明一些表明和字段的既然如此,那我们就创建好了,这个类可不简单,它主要通过注解去注明表单信息,然后映射给整个数据库,我们看package com.lgl.ormlite;import com.j256.ormlite.field.DatabaseField;import com.j256.ormlite.table.DatabaseTable;/*** bean类,对应的整个数据库的表单信息,帮助我们映射到整个数据库当中* Created by LGL on 2016/6/26.*///配置表名@DatabaseTable(tableName = "user_info")public class User {//配置主键id@DatabaseField(generatedId = true)private int id;//名称@DatabaseField(columnName = "name")private String name;//描述@DatabaseField(columnName = "desc")private String desc;//空构造public User(){}//构造方法public User(int id, String name, String desc) {this.id = id; = name;this.desc = desc;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", desc='" + desc + '\'' +'}';}}写起来还是逻辑性很强的,如果需要一些特别的参数的话,可以参考一下官网上的项目描述,首先在User类上添加@DatabaseTable(tableName = “user_info”),标明这是数据库中的一张表名字为user_info,然后分别在属性上添加@DatabaseField(columnName = “name”) ,columnName的值为该字段在数据中的列名,@DatabaseField(generatedId = true) ,generatedId 表示id为主键且自动生成,好了,到这里,我们继续看官方的文档了三.Dao类官网写的很详细呀,我们跟着造轮子既可呀,嘿嘿,那我们就来写这个Dao类吧,注意,注释写的很清楚了哦!package com.lgl.ormlite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;import com.j256.ormlite.dao.Dao;import com.j256.ormlite.support.ConnectionSource;import com.j256.ormlite.table.TableUtils;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;/*** Dao类* Created by LGL on 2016/6/26.*/public class DataBaseHelper extends OrmLiteSqliteOpenHelper {//创建数据库名称private static final String DATABASE_NAME = "ormlite_sql.db";//版本号private static final int DATABASE_VERSION = 1;//存放Daoprivate Map<String, Dao> maps = new HashMap<>();//单例模式private static DataBaseHelper instance;public static synchronized DataBaseHelper getInstance(Context context) { if (instance == null) {synchronized (DataBaseHelper.class) {if (instance == null) {instance = new DataBaseHelper(context);}}}return instance;}/*** 获得数据库的访问对象** @param cls* @return* @throws SQLException*/public synchronized Dao getDao(Class cls) throws SQLException {Dao dao = null;//通过反射获得类的名称String clsName = cls.getSimpleName();//是否存在该对象if (maps.containsKey(clsName)) {dao = maps.get(clsName);} else {dao = super.getDao(cls);maps.put(clsName, dao);}return dao;}/*** 关闭所有操作*/public void close() {super.close();//获取所有的map键值对置空for (String key : maps.keySet()) {Dao dao = maps.get(key);dao = null;}}//构造方法public DataBaseHelper(Context context) {//上下文,数据库名,null,版本号super(context, DA TABASE_NAME, null, DA TABASE_VERSION);}//创建数据库@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource){try {//对数据库的创建以及表的建立TableUtils.clearTable(connectionSource, User.class);} catch (SQLException e) {e.printStackTrace();}}//更新数据库@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {try {//调用更新就删除数据库TableUtils.dropTable(connectionSource, User.class, true);} catch (SQLException e) {e.printStackTrace();}}}到这里,我们的前期都OK了,紧接着,我们就可以去操作这些数据了四.UserDao类这个类主要是对数据的初始化和操作的package com.lgl.ormlite;import android.content.Context;import com.j256.ormlite.dao.Dao;import java.sql.SQLException;/*** 数据库操作类* Created by LGL on 2016/6/26.*/public class UserDao {//上下文private Context mContext;//主键查询private Dao<User,Integer>userDao;//Dao类private DataBaseHelper helper;public UserDao(Context mContext) {this.mContext = mContext;//创建数据库helper = DataBaseHelper.getInstance(mContext);try {//操作DaouserDao = helper.getDao(User.class);} catch (eption e) {e.printStackTrace();}}public void addUser(User user){try {userDao.create(user);} catch (SQLException e) {e.printStackTrace();}}}五.增OK,基本上现在可以去实际的操作了,这个UserDao类我们等下还需要去完善,现在先这样,我们去实现按钮的点击事件//点击事件@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_create_save:userDao = new UserDao(this);User user = new User();user.setName("lgl");user.setDesc("Android");userDao.addUser(user);break;}}到这里,我们就可以去操作了,我们去看数据库,打开DDMS既然插入成功了,那我们尝试一下多条语句的插入吧case R.id.btn_create_save:User user = new User();user.setName("lgl");user.setDesc("Android");userDao.addUser(user);User user1 = new User();user.setName("zhangsan");user.setDesc("IOS");userDao.addUser(user1);User user2 = new User();user.setName("lisi");user.setDesc("python");userDao.addUser(user2);break;OK,运行一下六.改我们继续操作UserDao这个类//更新Userpublic void updateUser(User user) {try {userDao.update(user);} catch (SQLException e) {e.printStackTrace();}}既然可以更新,那我们写个按钮<Buttonandroid:id="@+id/btn_update"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="修改数据" />写完之后,我们就可以执行了case R.id.btn_update://我们可以修改id为1的这个数据User user3 = new User();user3.setId(1);user3.setName("lgl帅哥");userDao.updateUser(user3);break;我们可以看下结果OK,这就是我们的改了,我们可以封装一下/*** 根据ID来更新* @param user* @param id*/public void updateById(User user,Integer id){try {userDao.updateId(user,id);} catch (SQLException e) {e.printStackTrace();}}还有一个修改方法/*** 修改数据,支持多条** @param user*/public void updateUserByBuilder(User user) {try {UpdateBuilder builder = userDao.updateBuilder();builder.updateColumnValue("name", user.getName()).where().eq("id", 1);builder.update();} catch (SQLException e) {e.printStackTrace();}}七.删除删除我们可以根据条件删除,就直接贴代码了/*** 删除** @param user*/public void deleteUser(User user) {//删除的方法比较多,根据的条件也比较多try {userDao.delete(user);} catch (SQLException e) {e.printStackTrace();}}/*** 多个对象的删除操作** @param users*/public void deleteMulUser(List<User> users) {try {userDao.delete(users);} catch (SQLException e) {e.printStackTrace();}}/*** 根据ID删除** @param ids*/public void deleteUserById(List<Integer> ids) {try {userDao.deleteIds(ids);} catch (SQLException e) {e.printStackTrace();}}你要删除直接调用就好了八.查查算是比较多的场景了,我们也可以多条件查询,看我们全部查询的例子/*** 全部查询** @return*/public List<User> listAll() {try {return userDao.queryForAll();} catch (SQLException e) {e.printStackTrace();}return null;}但是我们一般也不会用到全部查询,条件查询才是必须的,所以我们再新建一个按钮<Buttonandroid:id="@+id/btn_query"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查询数据" />OK.我们就可以查询了,我们写个单表查询/*** 查询单张表** @return*/public List<User> queryBuilder() {List<User> list = null;//查询器QueryBuilder<User, Integer> queryBuilder = userDao.queryBuilder();//声明where条件Where<User, Integer> where = queryBuilder.where();//查询sesc字段的name是哪个值try {where.eq("name", "lgl");where.and();where.eq("desc", "Android");where.prepare();list = queryBuilder.query();//select * from user_info where name = 'lgl' and desc = 'Android'} catch (SQLException e) {e.printStackTrace();}return list;}注意在点击事件里case R.id.btn_query:List<User> list = userDao.queryBuilder();Log.i(TAG, list.toString());break;好的,我们现在看Log这里写图片描述我们多条件查询/*** 多条件查询** @return*/public List<User> queryBuilders() {List<User> list = null;QueryBuilder<User, Integer> queryBuilder = userDao.queryBuilder();Where<User, Integer> where = queryBuilder.where();try {where.or(where.and(where.eq("", ""), where.eq("", "")),where.and(where.eq("", ""), where.ge("", ""))).query();} catch (SQLException e) {e.printStackTrace();}return list;}这里我们就不演示了最后,只能说,ORMLite是比较强大的,我们如果真的要去理解他的话,还是得去看他的API文档,不然真的无从下手!。
android sqlite基本知识

android sqlite基本知识Android SQLite是一种轻量级的嵌入式关系型数据库,广泛应用于Android应用程序的数据存储和管理。
本文将介绍Android SQLite 的基本知识,包括创建数据库、创建表、插入数据、查询数据、更新数据和删除数据等操作。
一、创建数据库在Android中使用SQLite数据库,首先要创建一个数据库。
可以通过继承SQLiteOpenHelper类来实现数据库的创建和版本管理。
SQLiteOpenHelper类提供了两个重要的方法,onCreate()和onUpgrade()。
onCreate()方法在数据库第一次被创建时调用,onUpgrade()方法在数据库版本发生变化时调用。
二、创建表数据库中的数据以表的形式存储。
在SQLite中,可以使用SQL语句来创建表,包括指定表的名称、字段名称和字段类型等。
创建表的操作通常在onCreate()方法中完成。
三、插入数据插入数据是将数据添加到表中的过程。
可以使用SQL语句的INSERT INTO语句来插入数据。
在Android中,可以使用ContentValues类来封装要插入的数据。
通过调用insert()方法,将封装好的ContentValues对象传入,即可实现数据的插入操作。
四、查询数据查询数据是从表中检索数据的过程。
可以使用SQL语句的SELECT 语句来查询数据。
在Android中,可以使用query()方法来执行查询操作。
query()方法接收多个参数,包括要查询的表名称、要查询的字段名称和查询条件等。
五、更新数据更新数据是修改表中已有数据的过程。
可以使用SQL语句的UPDATE语句来更新数据。
在Android中,可以使用update()方法来执行更新操作。
update()方法接收多个参数,包括要更新的表名称、要更新的字段和更新条件等。
六、删除数据删除数据是从表中删除数据的过程。
可以使用SQL语句的DELETE FROM语句来删除数据。
利用 ORMLite 进行对象关系映射和管理

利用 ORMLite 进行对象关系映射和管理ORMLite是一个用于Java平台的对象关系映射(ORM)工具,它提供了简单且灵活的方式来操作数据库。
通过ORMLite,我们可以将Java对象与数据库表进行映射,轻松地进行数据库操作,如插入、更新、查询和删除数据。
本文将介绍如何使用ORMLite进行对象关系映射和管理,为您提供一个清晰的操作指南。
一、概述对象关系映射(ORM)是一种编程技术,它将数据库中的数据与对象之间的映射关系定义在代码中。
它简化了数据库操作,让开发者能够像操作对象一样对待数据库数据。
ORMLite就是一款优秀的ORM工具,它支持多种数据库,如MySQL、SQLite、PostgreSQL等。
二、引入依赖在开始使用ORMLite之前,我们需要将ORMLite库添加到项目的依赖中。
可以通过Maven或Gradle来引入ORMLite库。
下面以Gradle 为例,展示如何引入ORMLite库的依赖:```implementation 'com.j256.ormlite:ormlite-core:5.1'implementation 'com.j256.ormlite:ormlite-jdbc:5.1'```三、定义实体类在使用ORMLite进行对象关系映射之前,我们需要先定义Java实体类。
实体类代表了数据库表中的字段,并映射了表与对象之间的关系。
```java@DatabaseTable(tableName = "users")public class User {@DatabaseField(generatedId = true)private int id;@DatabaseField(columnName = "name")private String name;@DatabaseField(columnName = "age")private int age;// Getters and setters}```在上述代码中,我们使用了ORMLite的注解来定义实体类。
一款安卓sqlite数据库对象关系映射框架的开发

Science &Technology Vision 科技视界了解安卓系统的人都知道,SQLite 是一款开源的轻量级关系型数据库,安卓系统原生内建了SQLite 的实现,以文件存储的方式在移动设备中存储数据。
而现在针对SQLite 数据库的对象关系映射,开发了一款新的框架,解决了SQLite 在编程时的效率和容错问题,它的名称是ChopinLite 。
这款框架既可作为安卓系统开发的实用工具,也可作为本科或高职专业移动开发课程的内容。
根据以往的体验,在使用Java 语言进行各类数据库的相关操作时,会经常用到Hibernate 等框架;而且在Java 语言编程教学中,一般也会把Hibernate 框架作为教学内容。
当体验过使用Hibernate 框架给编程带来的便利后,会发现进入安卓开发时,对于SQLite 数据库并未有类似框架的支持。
又因为精简内存的需要,安卓系统不适合使用较复杂的大型框架,只能使用轻量级的框架。
而目前能支持SQLite 数据库的第三方框架种类欠丰富,功能欠完善,操作也欠优化。
以目前较为流行的OrmLite 框架为例,其在连接时需要手动定义辅助类;定义映射及关联关系时所用的标识符过长且不够明确;操作时需要手动处理异常。
这些不足之处引发了进一步开发更为简单实用的新框架的需求,因此本框架应运而生。
本框架的优势在于:(1)弥补不足:本框架可以弥补目前SQLite 数据库的第三方框架的各种不足,实现搭建便捷、功能定位适当、操作优化的目的。
(2)填补空白:目前国内还没有公开发行的类似框架,主要都是公司内部的产权技术,因此本框架在某种程度上可以填补国内空白。
(3)辅助教学:本框架一方面能够满足实际生产中的简单安卓项目的快速开发,同时又可以作为课堂教学的辅助工具,甚至其自身的开发过程也可以作为教学内容,使学生能够快速掌握对象关系映射的原理和方法。
本框架的设计理念是精简和高效,其大致来自桌面平台的Hibernate 框架,但进行了大幅度的优化,同时摒弃了其他类似框架的各种不足之处,给使用者提供了极大的便利。
Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite对于我个人来说,我可能更加倾向于用GreenDao,所以今天也为大家带来了GreenDao的详细博客,希望大家喜欢,之前也详细介绍了ORM的思想,如果不明白可以先看一下前面的博文,这里就不多赘述了,我们新建一个工程传说中的优点最大性能(最快的Android ORM)易于使用API高度优化最小内存消耗首先,我们查看Github上的集成步骤,先添加依赖我们要添加compile 'org.greenrobot:greendao:2.2.1'同时也要添加Java的项目包compile 'org.greenrobot:greendao-generator:2.2.0'紧接着,我们在main目录下创建一个文件夹java-gen然后继续在配置文件中添加//仓库sourceSets{main{java.srcDirs = ['src/main/java','src/main/java-gen']}}最后,新建一个Module,选择Java Library,创建成功后,我们在他的build.gradle下添加compile 'org.greenrobot:greendao-generator:2.2.0'二.实体类到这里,我们的初步集成算是完成了,是不是比较麻烦,我们看她说现在去看java-gen有生成代码,实际上我们去看并没有,因为我们需要NoteDao.java,一个数据缓存对象,那我们需要怎么去做呢?我们直接在Module的类里写了package com.example;import de.greenrobot.daogenerator.DaoGenerator;import de.greenrobot.daogenerator.Entity;import de.greenrobot.daogenerator.Schema;public class DaoMaker {public static void main(String[] args) {//生成数据库的实体类,还有版本号Schema schema = new Schema(1, "com.student.entity");addStudent(schema);//指定daoschema.setDefaultJavaPackageDao("com.student.dao");try {//指定路径new DaoGenerator().generateAll(schema, "D:\\github\\GreenDao\\app\\src\\main\\java-gen");} catch (Exception e) {e.printStackTrace();}}/*** 创建数据库的表** @param schema*/public static void addStudent(Schema schema) {//创建数据库的表Entity entity = schema.addEntity("Student");//主键是int类型entity.addIdProperty();//名称entity.addStringProperty("name");//年龄entity.addIntProperty("age");//地址entity.addStringProperty("address");}}写完这个时候我们要注意了,我们不能直接去运动这个工程,我们要单独编译这个java类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的,那也是比较老的逻辑了,后来我们准备重构项目的时候,我决定把数据库也重构一下,因为我们当时的应用读取速度来还是比较慢的,比如你有一两年的数据之类的,我后来就研究了一下这两个框架,虽然我最后采用的是GreenDao,但是ORMLite也是研究了一会儿,所以,接下来,我将把这两个框架分两篇文章来分析,首先就是ORMLite了,网上还是有很多关于他们的文章的,所以我也是准备站在巨人的肩膀上,首先他们之间的优缺点,也有前辈写了,你可以参考一下SQLite数据库框架ORMLite与GreenDao的简单比较而且鸿洋老师也写了两篇关于ORMLite的文章Android ORMLite框架的入门用法Android快速开发系列ORMLite框架最佳实践但是就算他们写了,我觉得我再根据自己的逻辑去讲一遍,很多人还是会收益的,我自信我的文笔应该还是算不错的,而且我是基于Android studio来讲的。
嘻嘻,话不多说,我们来新建一个项目:一.准备工作在以前,我们写数据库时怎么写的?那就是频繁的去写SQLiteOpenHelper了,所以后来在我们开发中,很多人就喜欢封装他们,提高性能,也就出现了很多的数据库框架,ORMLite 算是一个佼佼者了们根据官方文档来看这个框架是怎么样集成的,官网上有共有四个步骤然后添加到libs目录下,然后右键——Add As Library就算是添加成功了,紧接着,我们在xml 中写个按钮用来创建表和保存数据<Buttonandroid:id="@+id/btn_create_save"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="创建表|保存数据"/>二.Bean类OK,我们继续看文档,他需要编写一个bean类来声明一些表明和字段的既然如此,那我们就创建好了,这个类可不简单,它主要通过注解去注明表单信息,然后映射给整个数据库,我们看package com.lgl.ormlite;import com.j256.ormlite.field.DatabaseField;import com.j256.ormlite.table.DatabaseTable;/***bean类,对应的整个数据库的表单信息,帮助我们映射到整个数据库当中*Created by LGL on2016/6/26.*///配置表名@DatabaseTable(tableName="user_info")public class User{//配置主键id@DatabaseField(generatedId=true)private int id;//名称@DatabaseField(columnName="name")private String name;//描述@DatabaseField(columnName="desc")private String desc;//空构造public User(){}//构造方法public User(int id,String name,String desc){this.id=id;=name;this.desc=desc;}public int getId(){return id;}public void setId(int id){this.id=id;}public String getName(){return name;}public void setName(String name){=name;}public String getDesc(){return desc;}public void setDesc(String desc){this.desc=desc;}@Overridepublic String toString(){return"User{"+"id="+id+",name='"+name+'\''+",desc='"+desc+'\''+'}';}}写起来还是逻辑性很强的,如果需要一些特别的参数的话,可以参考一下官网上的项目描述,首先在User类上添加@DatabaseTable(tableName=“user_info”),标明这是数据库中的一张表名字为user_info,然后分别在属性上添加@DatabaseField(columnName=“name”),columnName的值为该字段在数据中的列名,@DatabaseField(generatedId=true),generatedId 表示id为主键且自动生成,好了,到这里,我们继续看官方的文档了三.Dao类官网写的很详细呀,我们跟着造轮子既可呀,嘿嘿,那我们就来写这个Dao类吧,注意,注释写的很清楚了哦!package com.lgl.ormlite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao;import com.j256.ormlite.support.ConnectionSource;import com.j256.ormlite.table.TableUtils;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;/***Dao类*Created by LGL on2016/6/26.*/public class DataBaseHelper extends OrmLiteSqliteOpenHelper{ //创建数据库名称private static final String DATABASE_NAME="ormlite_sql.db";//版本号private static final int DATABASE_VERSION=1;//存放Daoprivate Map<String,Dao>maps=new HashMap<>();//单例模式private static DataBaseHelper instance;public static synchronized DataBaseHelper getInstance(Context context){ if(instance==null){synchronized(DataBaseHelper.class){if(instance==null){instance=new DataBaseHelper(context);}}}return instance;}/***获得数据库的访问对象**@param cls*@return*@throws SQLException*/public synchronized Dao getDao(Class cls)throws SQLException{Dao dao=null;//通过反射获得类的名称String clsName=cls.getSimpleName();//是否存在该对象if(maps.containsKey(clsName)){dao=maps.get(clsName);}else{dao=super.getDao(cls);maps.put(clsName,dao);}return dao;}/***关闭所有操作*/public void close(){super.close();//获取所有的map键值对置空for(String key:maps.keySet()){Dao dao=maps.get(key);dao=null;}}//构造方法public DataBaseHelper(Context context){//上下文,数据库名,null,版本号super(context,DATABASE_NAME,null,DATABASE_VERSION);}//创建数据库@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase,ConnectionSource connectionSource){try{//对数据库的创建以及表的建立TableUtils.clearTable(connectionSource,User.class);}catch(SQLException e){e.printStackTrace();}}//更新数据库@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase,ConnectionSource connectionSource,int i,int i1){try{//调用更新就删除数据库TableUtils.dropTable(connectionSource,User.class,true);}catch(SQLException e){e.printStackTrace();}}}到这里,我们的前期都OK了,紧接着,我们就可以去操作这些数据了四.UserDao类这个类主要是对数据的初始化和操作的package com.lgl.ormlite;import android.content.Context;import com.j256.ormlite.dao.Dao;import java.sql.SQLException;/***数据库操作类*Created by LGL on2016/6/26.*/public class UserDao{//上下文private Context mContext;//主键查询private Dao<User,Integer>userDao;//Dao类private DataBaseHelper helper;public UserDao(Context mContext){this.mContext=mContext;//创建数据库helper=DataBaseHelper.getInstance(mContext);try{//操作DaouserDao=helper.getDao(User.class);}catch(eption e){e.printStackTrace();}}public void addUser(User user){try{userDao.create(user);}catch(SQLException e){e.printStackTrace();}}}五.增OK,基本上现在可以去实际的操作了,这个UserDao类我们等下还需要去完善,现在先这样,我们去实现按钮的点击事件//点击事件@Overridepublic void onClick(View v){switch(v.getId()){case R.id.btn_create_save:userDao=new UserDao(this);User user=new User();user.setName("lgl");user.setDesc("Android");userDao.addUser(user);break;}}到这里,我们就可以去操作了,我们去看数据库,打开DDMS既然插入成功了,那我们尝试一下多条语句的插入吧case R.id.btn_create_save:User user=new User();user.setName("lgl");user.setDesc("Android");userDao.addUser(user);User user1=new User();user.setName("zhangsan");user.setDesc("IOS");userDao.addUser(user1);User user2=new User();user.setName("lisi");user.setDesc("python");userDao.addUser(user2);break;OK,运行一下六.改我们继续操作UserDao这个类//更新Userpublic void updateUser(User user){try{userDao.update(user);}catch(SQLException e){e.printStackTrace();}}既然可以更新,那我们写个按钮<Buttonandroid:id="@+id/btn_update"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="修改数据"/>写完之后,我们就可以执行了case R.id.btn_update://我们可以修改id为1的这个数据User user3=new User();user3.setId(1);user3.setName("lgl帅哥");userDao.updateUser(user3);break;我们可以看下结果OK,这就是我们的改了,我们可以封装一下/***根据ID来更新*@param user*@param id*/public void updateById(User user,Integer id){try{userDao.updateId(user,id);}catch(SQLException e){e.printStackTrace();}}还有一个修改方法/***修改数据,支持多条**@param user*/public void updateUserByBuilder(User user){try{UpdateBuilder builder=userDao.updateBuilder();builder.updateColumnValue("name",user.getName()).where().eq("id",1);builder.update();}catch(SQLException e){e.printStackTrace();}}七.删除删除我们可以根据条件删除,就直接贴代码了/***删除**@param user*/public void deleteUser(User user){//删除的方法比较多,根据的条件也比较多try{userDao.delete(user);}catch(SQLException e){e.printStackTrace();}}/***多个对象的删除操作**@param users*/public void deleteMulUser(List<User>users){try{userDao.delete(users);}catch(SQLException e){e.printStackTrace();}}/***根据ID删除**@param ids*/public void deleteUserById(List<Integer>ids){try{userDao.deleteIds(ids);}catch(SQLException e){e.printStackTrace();}}你要删除直接调用就好了八.查查算是比较多的场景了,我们也可以多条件查询,看我们全部查询的例子/***全部查询**@return*/public List<User>listAll(){try{return userDao.queryForAll();}catch(SQLException e){e.printStackTrace();}return null;}但是我们一般也不会用到全部查询,条件查询才是必须的,所以我们再新建一个按钮<Buttonandroid:id="@+id/btn_query"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查询数据"/>OK.我们就可以查询了,我们写个单表查询/***查询单张表**@return*/public List<User>queryBuilder(){List<User>list=null;//查询器QueryBuilder<User,Integer>queryBuilder=userDao.queryBuilder();//声明where条件Where<User,Integer>where=queryBuilder.where();//查询sesc字段的name是哪个值try{where.eq("name","lgl");where.and();where.eq("desc","Android");where.prepare();list=queryBuilder.query();//select*from user_info where name='lgl'and desc='Android'}catch(SQLException e){e.printStackTrace();}return list;}注意在点击事件里case R.id.btn_query:List<User>list=userDao.queryBuilder();Log.i(TAG,list.toString());break;好的,我们现在看Log这里写图片描述我们多条件查询/***多条件查询**@return*/public List<User>queryBuilders(){List<User>list=null;QueryBuilder<User,Integer>queryBuilder=userDao.queryBuilder();Where<User,Integer>where=queryBuilder.where();try{where.or(where.and(where.eq("",""),where.eq("","")),where.and(where.eq("",""),where.ge("",""))).query();}catch(SQLException e){e.printStackTrace();}return list;}这里我们就不演示了最后,只能说,ORMLite是比较强大的,我们如果真的要去理解他的话,还是得去看他的API文档,不然真的无从下手!。