Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的,那也是比较老的逻辑了,后来我们准备重构项目的时候,我决定把数据库也重构一下,因为我们当时的应用读取速度来还是比较慢的,比如你有一两年的数据之类的,我后来就研究了一下这两个框架,虽然我最后采用的是GreenDao,但是ORMLite也是研究了一会儿,所以,接下来,我将把这两个框架分两篇文章来分析,首先就是ORMLite了,网上还是有很多关于他们的文章的,所以我也是准备站在巨人的肩膀上,首先他们之间的优缺点,也有前辈写了,你可以参考一下
而且鸿洋老师也写了两篇关于ORMLite的文章
但是就算他们写了,我觉得我再根据自己的逻辑去讲一遍,很多人还是会收益的,我自信我的文笔应该还是算不错的,而且我是基于Android studio来讲的。嘻嘻,话不多说,我们来新建一个项目:
一.准备工作
在以前,我们写数据库时怎么写的?那就是频繁的去写SQLiteOpenHelper了,所以后来在我们开发中,很多人就喜欢封装他们,提高性能,也就出现了很多的数据库框架,ORMLite算是一个佼佼者了
我们根据官方文档来看这个框架是怎么样集成的,官网上有共有四个步骤
知道他需要两个jar,一个android的,一个core的可以直接去下载
然后添加到libs目录下,然后右键——Add As Library就算是添加成功了,紧接着,我们在xml中写个按钮用来创建表和保存数据
<Button
android: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;
this.name = 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) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public 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;
//存放Dao
private 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);
}
//创建数据库
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
try {
//对数据库的创建以及表的建立
TableUtils.clearTable(connectionSource, User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
//更新数据库
@Override
public 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 {
//操作Dao
userDao = helper.getDao(User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void addUser(User user){
try {
userDao.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
五.增
OK,基本上现在可以去实际的操作了,这个UserDao类我们等下还需要去完善,现在先这样,我们去实现按钮的点击事件
//点击事件
@Override
public 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这个类
//更新User
public void updateUser(User user) {
try {
userDao.update(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
既然可以更新,那我们写个按钮
<Button
android: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;
}
但是我们一般也不会用到全部查询,条件查询才是必须的,所以我们再新建一个按钮
<Button
android: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文档,不然真的无从下手,我这篇博文也只是希望大家能对ORMLite有个大概的了解,不敢妄自说精通,好的,本篇博客到这里也就结束了,如果大家觉得还不错的话,不妨点个赞!
Demo下载:http://download.csdn.net/detail/qq_26787115/9562367
欢迎加群:555974449
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包的更多相关文章
-
Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
-
Android 数据库框架ormlite
Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...
-
Android数据库框架-----ORMLite 的基本用法
ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...
-
Android数据库框架-----ORMLite关联表的使用
上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用 ...
-
Android 数据库框架OrmLite的使用(一)
在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...
-
对象关系映射ORM
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...
-
Django 源码小剖: Django 对象关系映射(ORM)
引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...
-
Python 3 对象关系映射(ORM)
ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...
-
对象关系映射(ORM)框架GreenDao简介和基本使用
官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案. GreenDao特点 性能最大化,可能是Android平台上最快的ORM框架 易于使用的A ...
随机推荐
-
总结-mysql
执行sql脚本: source C:/users/liaolongjun/Desktop/miduo_fileinfo.sql; 注意,必须是正斜杆.如果是反斜杆,也会执行,但会报错. 导入数据: L ...
-
iOS的内购
内购: 向苹果付钱购买与APP的使用相关的产品(游戏中的道具,装备等): 苹果将收到的钱按比例,转给APP方: 不同于APP中的第三方支付(不经过苹果):
-
SQLAlchemy高级ORM之改查删除及GROUP,JOIN...
按书上案例来的. #coding=utf-8 from datetime import datetime from sqlalchemy import (MetaData, Table, Column ...
-
移动端-解决ios连续点击页面上移问题
引入js即可 //解决ios双击页面上移问题//在项目中测试不紧input/button这些表单控件有这个问题,p,div等也有问题,于是乎就直接在body开刀了(function(){ var ag ...
-
SAP 库存查询算法
SAP 的后台有关库存的表,是一种很有意思的表.库存表分两种,一种是当前库存表,另一种是历史库存表.例如有MARD\MCHB\MSPR\MKOL等表,对应的历史库存表就是MARDH\MCHBH\MSP ...
-
C# 4.0 并行计算部分
C# 4.0 并行计算部分 c#linq算法多线程list微软 目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...
-
html链接
1. <a href="/index.html">本文本</a> 是一个指向本网站中的一个页面的链接.</p><p><a hr ...
-
jsoup 解析html 页面数据
我html 页面元素: /html/body/table[2]/tbody/tr[1]/td/table/tbody/tr[1]/td[2]/font/html/body/table[2]/tbody ...
-
Java之路——名词解释(一)
一.开篇 许多人在初接触Java的时候,都会被各种Java的英文缩写名词给弄得头晕脑胀.看一个技术,内容里又会有一堆其他的技术名词,看了半天不知所云.尝试去查一下这些名词的解释,除了非常学术性的解释之 ...
-
带着萌新看springboot源码
springboot的功能确实强悍,只需要很少的配置,就能够做出来一个简单的web应用,下面我就简要的分析一下为什么springboot能够起作用. 不觉得很奇怪吗?只需要一个主配置类(就是启动那个m ...