上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法。

本文主要介绍两表相互关联的使用,如同外键,相互的查询功能;

创建 User和Article类

@DatabaseTable(tableName = "tb_user")
public class User
{
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnName = "name")
private String name; @ForeignCollectionField
private Collection<Article> articles; public Collection<Article> getArticles()
{
return articles;
} public void setArticles(Collection<Article> articles)
{
this.articles = articles;
} public User()
{
} 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;
} @Override
public String toString()
{
return "User [id=" + id + ", name=" + name + ", articles=" + articles
+ "]";
} }
@ForeignCollectionField
private Collection<Article> articles;

每个User关联一个或多个Article,如果我在User中声明一个Collection<Article> articles,我能否在查询User的时候,一并能够获取到articles的值。

@DatabaseTable(tableName = "tb_article")
public class Article
{
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String title;
@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true)
private 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
+ "]";
} }

在user属性的注解上:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true)

添加foreignAutoRefresh =true,这样;当调用queryForId时,拿到Article对象则直接携带了user;

DatabaseHelpe.java

public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
private static final String TABLE_NAME = "sqlite-test.db"; private Map<String, Dao> daos = new HashMap<String, Dao>(); private DatabaseHelper(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);
} 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);
onCreate(database, connectionSource);
} catch (SQLException e)
{
e.printStackTrace();
}
} private static DatabaseHelper instance; /**
* 单例获取该Helper
*
* @param context
* @return
*/
public static synchronized DatabaseHelper getHelper(Context context)
{
context = context.getApplicationContext();
if (instance == null)
{
synchronized (DatabaseHelper.class)
{
if (instance == null)
instance = new DatabaseHelper(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;
}
} }

Userdao操作类

public class UserDao
{
private Context context;
private Dao<User, Integer> userDaoOpe;
private DatabaseHelper helper; public UserDao(Context context)
{
this.context = context;
try
{
helper = DatabaseHelper.getHelper(context);
userDaoOpe = helper.getDao(User.class);
} catch (SQLException e)
{
e.printStackTrace();
}
} /**
* 增加一个用户
*
* @param user
* @throws SQLException
*/
public void add(User user)
{
/*//事务操作
TransactionManager.callInTransaction(helper.getConnectionSource(),
new Callable<Void>()
{ @Override
public Void call() throws Exception
{
return null;
}
});*/
try
{
userDaoOpe.create(user);
} catch (SQLException e)
{
e.printStackTrace();
} } public User get(int id)
{
try
{
return userDaoOpe.queryForId(id);
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
} }

ArticleDao操作类

public class ArticleDao
{
private Dao<Article, Integer> articleDaoOpe;
private DatabaseHelper helper; @SuppressWarnings("unchecked")
public ArticleDao(Context context)
{
try
{
helper = DatabaseHelper.getHelper(context);
articleDaoOpe = helper.getDao(Article.class);
} catch (SQLException e)
{
e.printStackTrace();
}
} /**
* 添加一个Article
*
* @param article
*/
public void add(Article article)
{
try
{
articleDaoOpe.create(article);
} catch (SQLException e)
{
e.printStackTrace();
}
} /**
* 通过Id得到一个Article
*
* @param id
* @return
*/
@SuppressWarnings("unchecked")
public Article getArticleWithUser(int id)
{
Article article = null;
try
{
article = articleDaoOpe.queryForId(id);
helper.getDao(User.class).refresh(article.getUser()); } catch (SQLException e)
{
e.printStackTrace();
}
return article;
} /**
* 通过Id得到一篇文章
*
* @param id
* @return
*/
public Article get(int id)
{
Article article = null;
try
{
article = articleDaoOpe.queryForId(id); } catch (SQLException e)
{
e.printStackTrace();
}
return article;
} /**
* 通过UserId获取所有的文章
*
* @param userId
* @return
*/
public List<Article> listByUserId(int userId)
{
try
{
QueryBuilder<Article, Integer> articleBuilder = articleDaoOpe
.queryBuilder();
QueryBuilder userBuilder = helper.getDao(User.class).queryBuilder();
articleBuilder.join(userBuilder); /*Where<Article, Integer> where = articleBuilder.where();
where.eq("user_id", 1);
where.and();
where.eq("title", "ORMLite数据库"); return where.query();*/ // 或者
/*return articleDaoOpe.queryBuilder().//
where().//
eq("user_id", 1).and().//
eq("title", "ORMLite数据库").query();*/ //复杂的查询
/*where.or(
//
where.and(//
where.eq("user_id", 1), where.eq("name", "xxx")),
where.and(//
where.eq("user_id", 2), where.eq("name", "yyy")));*/ return articleDaoOpe.queryBuilder().where().eq("user_id", userId)
.query();
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
}

条件查询QueryBuilder的使用

用于where查询,在ArticleDao类中包含的有。更多的用法,去官方文档查看,源码中提供了文档;

提示:运行测试时,要先添加数据,源码未做错误处理  源码点击下载

不足之处请留言指正!有问题的可以给我留言!谢谢!

Android数据库框架-----ORMLite关联表的使用的更多相关文章

  1. Android数据库框架-----ORMLite 的基本用法

    ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...

  2. Android 数据库框架OrmLite的使用(一)

    在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...

  3. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  4. Android 数据库框架ormlite

    Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...

  5. Android 数据库框架OrmLite的使用(二)

    前面说了OrmLite的基本使用,现在说下更规范的做法以及常用的一些功能. 1.DatabaseHelper package com.example.ormlite.db; import java.s ...

  6. Android数据库框架-ORMLite

    参考资料 Android ORMLite 框架的入门用法 Android 快速开发系列 ORMLite 框架最佳实践 添加依赖 compile 'com.j256.ormlite:ormlite-an ...

  7. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  8. Android 数据库框架总结(转)

    转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...

  9. Android 数据库框架总结,总有一个适合你!

    一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...

随机推荐

  1. Linux kernel 'mq_notify'内存错误引用漏洞

    更新系统内核即可!参看http://www.cnblogs.com/peteremperor/p/9065998.html

  2. JAVA集合详解(Collection和Map接口)

    原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...

  3. 给idea配置默认的maven

    一.配置Maven环境 1.下载apache-maven文件,选择自己需要的版本,地址: http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.0/bin ...

  4. 深拷贝与浅拷贝js,方法

    在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生. 参考 ...

  5. 了解Java应用中的开发攻击

    注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是允许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能完全改变最初预计的执行过程,产生恶意效果. 下面是几种主要的注入式攻击途径 ...

  6. ansible playbook部署ELK集群系统

    一.介绍 总共4台机器,分别为 192.168.1.99 192.168.1.100 192.168.1.210 192.168.1.211 服务所在机器为: redis:192.168.1.211 ...

  7. Nginx访问控制_登陆权限的控制(http_auth_basic_module)

    Nginx提供HTTP的Basic Auth功能,配置了Basic Auth之后,需要输入正确的用户名和密码之后才能正确的访问网站. 我们使用htpasswd来生成密码信息,首先要安装httpd-to ...

  8. JS的Scope

    关键字:域(scope),闭包(closure),关键字this,命名空间(namespace),函数域(function scope),全局域(global scope),词法作用域(lexical ...

  9. COJS:1829. [Tyvj 1728]普通平衡树

    ★★★   输入文件:phs.in   输出文件:phs.out   简单对比 时间限制:1 s   内存限制:128 MB [题目描述] 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需 ...

  10. git revert

    1. 我认为这是正确的做法: git fetch --all git reset --hard origin/master git fetch下载远程最新的,但不尝试,或重订任何东西. 然后,git ...