Android 数据库框架OrmLite的使用(二)
前面说了OrmLite的基本使用,现在说下更规范的做法以及常用的一些功能。
1.DatabaseHelper
package com.example.ormlite.db;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import com.example.ormlite.bean.Article;
import com.example.ormlite.bean.User;
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;
/**
* 1.整个DatabaseHelper使用单例只对外公布一个对象,保证app中只存在一个SQLite Connection,参考文章:http://www.touchlab.co/2011/10/single-sqlite-connection/
* 2.对每个Bean创建一个XXXDao来处理当前Bean的数据库操作,当然真正去和数据库打交道的对象,通过getDao(T t)进行获取
* getDao为一个泛型方法,会根据传入的Class对象进行创建Dao,并且用一个Map来保存对所有的Dao对象,只有第一次调用时才会去调用底层的getDao()。
* @author Administrator
*
*/
public class DatabaseHelperTwo extends OrmLiteSqliteOpenHelper{ private static final String TABLE_NAME="sqlite-test.db";
private static DatabaseHelperTwo instance; private Map<String,Dao> daos=new HashMap<String,Dao>();
public DatabaseHelperTwo(Context context) {
super(context, TABLE_NAME, null, 4);
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, User.class);
TableUtils.createTable(connectionSource, Article.class);
// TableUtils.createTable(connectionSource, Student.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion,
int newVersion) {
try {
TableUtils.dropTable(connectionSource, User.class, true);
TableUtils.dropTable(connectionSource, Article.class, true);
// TableUtils.dropTable(connectionSource, Student.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 单例获取该Helper
* @param context
* @return
*/
public static synchronized DatabaseHelperTwo getHelper(Context context){
context=context.getApplicationContext();
if(instance==null){
synchronized(DatabaseHelperTwo.class){
if(instance==null){
instance=new DatabaseHelperTwo(context);
}
}
}
return instance;
} public synchronized Dao getDao(Class clazz) throws SQLException{
Dao dao=null;
String className=clazz.getSimpleName();
if(daos.containsKey(className)){
dao=daos.get(className);
}
if(dao==null){
dao=super.getDao(clazz);
daos.put(className, dao);
}
return dao;
} /**
* 释放资源
*/
@Override
public void close() {
super.close();
for (String key : daos.keySet()) {
Dao dao=daos.get(key);
dao=null;
}
}
}
2.编写Dao类
package com.example.ormlite.dao;
import java.sql.SQLException;
import com.example.ormlite.bean.User;
import com.example.ormlite.db.DatabaseHelperTwo;
import com.j256.ormlite.dao.Dao;
import android.content.Context; public class UserDaoTwo {
private Context context;
private Dao<User,Integer> userDaoImpl;
private DatabaseHelperTwo helper; @SuppressWarnings("unchecked")
public UserDaoTwo(Context context){
this.context=context;
try {
helper=DatabaseHelperTwo.getHelper(context);
userDaoImpl=helper.getDao(User.class);
} catch (SQLException e) {
e.printStackTrace();
}
} public void add(User user){
try {
userDaoImpl.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
//......other operations
}
3.外键引用
package com.example.ormlite.bean;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
* ORMLite外键引用
* 需求:两个表User,Article,其中Article中需要存储User的主键作为关联,在ORMLite中如何实现?
* 直接在Article中声明一个Int类型userId属性,当作普通属性处理搞定,也是可行的。但是并没有体现面向对象的思想。
* 可按如下实现:
* 1.不去定义一个int类型的userId,而是直接定义一个User成员变量,表示本Article属于该User。
* 2.在User user属性上添加:@DatabaseField(canBeNull=true,foreign=true,columnName="user_id")
* canBeNull--表示不能为null;foreign=true表示一个外键;columnName列名
* @author Administrator
*
*/
@DatabaseTable(tableName="tb_article")
public class Article {
@DatabaseField(generatedId=true)
private int id;
@DatabaseField(columnName="title")
private String title;
@DatabaseField(canBeNull=true,foreign=true,columnName="user_id")
private User user;
public Article() {
super();
// TODO Auto-generated constructor stub
}
public Article(String title, User user) {
super();
this.title = title;
this.user = user;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Article [id=" + id + ", title=" + title + ", user=" + user
+ "]";
}
}
接下来编写ArticleDao:
package com.example.ormlite.dao;
import java.sql.SQLException;
import java.util.List;
import android.content.Context;
import com.example.ormlite.bean.Article;
import com.example.ormlite.bean.User;
import com.example.ormlite.db.DatabaseHelperTwo;
import com.j256.ormlite.dao.Dao; public class ArticleDao {
private Dao<Article,Integer> articleDaoImpl;
private DatabaseHelperTwo helper; @SuppressWarnings("unchecked")
public ArticleDao(Context context){
helper=DatabaseHelperTwo.getHelper(context);
try {
articleDaoImpl=helper.getDao(Article.class);
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 添加
* @param article
*/
public void add(Article article){
try {
articleDaoImpl.create(article);
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 通过Id得到一个Article
* @param id
* @return
*/
@SuppressWarnings("unchecked")
public Article getArticleWithUser(int id){
Article article=null;
try {
article=articleDaoImpl.queryForId(id);
//如何做到只传一个Article的id,然后能够拿到Article对象,且内部的user属性直接赋值?
//方式1
helper.getDao(User.class).refresh(article.getUser());
//方式2
//在user属性的注解上:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true)
//foreignAutoRefresh =true,当调用queryForId时,拿到Article对象则直接携带了user
} catch (SQLException e) {
e.printStackTrace();
}
return article;
} /**
* 通过Id得到一片文章
* @param id
* @return
*/
public Article getArticleById(int id){
Article article=null;
try {
article=articleDaoImpl.queryForId(id);
} catch (SQLException e) {
e.printStackTrace();
}
return article;
} public List<Article> getArticleListByUserId(int userId){
try {
return articleDaoImpl.queryBuilder().where().eq("user_id", userId).query();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
测试:
package com.example.ormlite.test;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.example.ormlite.bean.Article;
import com.example.ormlite.bean.User;
import com.example.ormlite.dao.ArticleDao;
import com.example.ormlite.dao.UserDao;
import com.example.ormlite.dao.UserDaoTwo; public class OrmLiteDbTestTwo extends AndroidTestCase{
public void AddArticle(){
User u=new User();
u.setName("yq");
u.setDesc("developer");
new UserDao(getContext()).add(u); Article article=new Article();
article.setTitle("ORMLite的使用");
article.setUser(u);
new ArticleDao(getContext()).add(article);
} public void testGetArticleById(){
Article article = new ArticleDao(getContext()).getArticleById(1);
Log.i("OrmLiteDbTestTwo", article.getUser().toString() + " , " + article.getTitle());
} /**
* 通过id获取一个携带User的Article
*/
public void testGetArticleWithUser(){
Article article = new ArticleDao(getContext()).getArticleWithUser(1);
Log.i("OrmLiteDbTestTwo", article.getUser().toString() + " , " + article.getTitle());
} public void testSGetArticleListByUserId(){
List<Article> articles =new ArticleDao(getContext()).getArticleListByUserId(1);
Log.i("OrmLiteDbTestTwo", articles.toString());
}
}
4.关联一个集合
每个User关联一个或多个Article,如果在User中声明一个Collection<Article> articles,可否做到在查询User的时候一并能够获取到articles的值?
是可以的。在User中加属性:
@ForeignCollectionField
private Collection<Article> articles;
UserDao中加方法:
public User getUserById(int id){
try {
return userDaoImpl.queryForId(id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
测试中加方法:
public void testGetUserById(){
User user=new UserDaoTwo(getContext()).getUserById(2);
Log.i("OrmLiteDbTestTwo", user.getName());
if(user.getArticles()!=null){
for (Article article : user.getArticles()) {
Log.i("OrmLiteDbTestTwo", article.toString());
}
}
}
5.查询条件QueryBuilder的使用
(1)简单的where等于
articleDaoImpl.queryBuilder().where().eq("user_id", userId).query(); //返回Article的列表
(2)where and
QueryBuilder<Article, Integer> queryBuilder=articleDaoImpl.queryBuilder();
Where<Article, Integer> where=queryBuilder.where();
where.eq("user_id", 2);
where.and();
where.eq("name", "xxx"); //或者
articleDaoImpl.queryBuilder().where().eq("user_id", userId).and().eq("name", "xxx");
上述的两种方法都相当于:select * from tb_article where user_id = 2 and name = 'xxx' ;
(3)复杂查询
where.or(
where.and(
where.eq("user_id", 1),where.eq("name", "xxx")),
where.and(
where.eq("user_id", 2),where.eq("name", "yyy")));
select * from tb_article where ( user_id = 1 and name = 'xxx' ) or ( user_id = 2 and name = 'yyy' ) ;
再复杂的查询也可通过拼凑获得。
6.updateBuilder、deleteBuilder
使用queryBuilder是我们希望查询完后直接返回List<Bean>集合,对于update我们并不关注返回值,可以直接用articleDaoImpl.updateRaw(statement, arguments);传入sql和参数即可。也就没必要去用
articleDaoImpl.updateBuilder().updateColumnValue("name","zzz").where().eq("user_id", 1);这么痛苦了。
同理,deleteBuilder也建议直接瓶邪sql,当然很简单的除外。
7.事务
在Dao中直接写如下代码:
TransactionManager.callInTransaction(helper.getConnectionSource(),
new Callable<Void>() { @Override
public Void call() throws Exception { return null;
}
});
8.其他操作
1.当Bean继承BaseDaoEnable时,可以使用bean.create(bean); bean.update(bean)一类操作
例如:
package com.example.ormlite.bean;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.misc.BaseDaoEnabled;
import com.j256.ormlite.table.DatabaseTable; @DatabaseTable(tableName = "tb_student")
public class Student extends BaseDaoEnabled<Student, Integer>
{
@DatabaseField(generatedId = true)
private int id; @DatabaseField
private String name; public Student(){
} 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;
}
}
Dao dao=DatabaseHelperTwo.getHelper(context).getDao(Student.class);
Student stu=new Student();
stu.setDao(dao);
stu.setName("qq");
stu.create();
前提是dao需要手动设置,如果dao为null会报错。
2.Join
Article与User做Join操作:
QueryBuilder<Article, Integer> articleBuilder = articleDaoImpl.queryBuilder();
QueryBuilder userBuilder = helper.getDao(User.class).queryBuilder();
articleBuilder.join(userBuilder);
其他具体的查看官方文档。
源码下载:http://pan.baidu.com/s/1ntMX99n 提取码:jri5
Android 数据库框架OrmLite的使用(二)的更多相关文章
- Android 数据库框架OrmLite的使用(一)
在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- Android 数据库框架ormlite
Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...
- Android数据库框架-----ORMLite关联表的使用
上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用 ...
- Android数据库框架-----ORMLite 的基本用法
ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...
- Android数据库框架-ORMLite
参考资料 Android ORMLite 框架的入门用法 Android 快速开发系列 ORMLite 框架最佳实践 添加依赖 compile 'com.j256.ormlite:ormlite-an ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Android 数据库框架总结(转)
转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...
- Android 数据库框架总结,总有一个适合你!
一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...
随机推荐
- Centos7 编译安装 Nginx PHP Mariadb Memcached 扩展 ZendOpcache扩展 (实测 笔记 Centos 7.3 + Mariadb 10.1.20 + Nginx 1.10.2 + PHP 7.1.0 + Laravel 5.3 )
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 安装步骤: 1.准备 1.0 查看硬 ...
- Ubuntu下安装mod_python报错(GIT错误)
Ubuntu下安装mod_python3.4.1版本报出如下错误: writing byte-compilation script '/tmp/tmpE91VXZ.py' /usr/bin/pytho ...
- webpack如何与gulpfile联合的使用
一.对webpack的一些理解 webpack支持CommonJS的书写形式. CommonJS指一个文件一个模块,但会一次性加载(即同步加载),但在浏览器端不适用这种方式,加载速率什么的,于是引入了 ...
- MIME(多用途互联网邮件扩展类型)
MIME对照表 百度百科 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.(百度百科).是设定某种扩展名的文件用一种应用程序来打开的方式 ...
- C#时间戳转换
,,)).ToUniversalTime ().Ticks ) / ;//先取得当前的UTC时间,然后转换成计算用的周期数(简称计时周期数),每个周期为100纳钞(ns)=0.1微秒(us)=0.00 ...
- 华为oj 购物单
这两天断断续续敲完这个(放假的时候比较懒),一次成功有点小激动(●'◡'●) 不过貌似从第一次打开开始计时..... 这道题目很像01背包,我将附件与它们的主件绑定(就是link起来)然后套用动态规 ...
- poj2718-Smallest Difference(枚举全排列)
一,题意: 给出最多10个数字,将它们划分为两个整数,求差值最小的值(除非只有一位数,否则不允许出现先导0) 很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2.二,思路: 利用nex ...
- Linux 配置YUM
标签:MYSQL/linux 概述 文章主要介绍配置163,mysql,epel这三个yum源. 目录 概述 步骤 下载安装包 卸载自带的yum 安装yum包 添加yum 总结 步骤 安装163源 注 ...
- APOC 15 Years Celebration
最近很忙,没有及时更新博客,也没有参加各种活动,唯一的活动就是接下来要讲的APOC 15 Years Celebration.不知不觉,自己也加入APOC有一年多了,正如大家所说“岁月是把杀猪刀”,我 ...
- 关于分工的思考 (Thoughts on Division of Labor)
Did you ever have the feeling that adding people doesn't help in software development? Did you ever ...