简便数据库——ORMLite框架
一、创建DataBase
//使用 Singleton 避免產生多個實例(instance),要注意 thread safe 這邊使用雙重鎖定(Double-checked locking)
使用 TableUtils 類別建立及刪除表格 //第一步继承 OrmLiteSqliteOpenHelper
public class DatabaseHelper extends OrmLiteSqliteOpenHelper { //版本号
private static final int DATABASE_VERSION = 1;
//版本名
private static final String DATABASE_NAME = "Demo";
//单例
private static DatabaseHelper instance; private DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
} //运用单例,加上双层线程锁,避免多创建DataBase
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;
} //删除并重新创建
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource, User.class, true);
TableUtils.dropTable(connectionSource, Group.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
} //创建 表格
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, User.class);
TableUtils.createTable(connectionSource, Group.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
DataBaseHelper
二、创建相应的JavaBean
public class User {
//注意事项:一定要加上@DatabaseField 说明这是表中的字段,这语句就是sql语句中设定主键,外键之类的。。。
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String name;
@DatabaseField
private String psd;
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 getPsd() {
return psd;
}
public void setPsd(String psd) {
this.psd = psd;
}
}
User
三、创建对DataBase的操作(这里创建操作的泛型,就是所有Dao类型都能使用)
//承接DatBaseHelper
....
//参数是Class类型
private HashMap<String,RuntimeExceptionDao> mRuntimeDaos = new HashMap<>(); public RuntimeExceptionDao getRuntimeDao(Class bean){ RuntimeExceptionDao dao = null;
String className = bean.getSimpleName();
//防止重新创建Dao
if (mRuntimeDaos.containsKey(className)){
dao = mRuntimeDaos.get(className);
}
else {
//重要的地方,如何创建Dao
dao = super.getRuntimeExceptionDao(bean);
}
return dao;
}
DataBase
四、创建对应的Dao(处理JavaBean与DataBase之间的操作)
public class UserDao {
private RuntimeExceptionDao mRuntimeDao;
//构造方法中获取Dao,用来操作数据库
public UserDao(Context context) {
DataBaseHelper dataBaseHelper = DataBaseHelper.getHelper(context);
mRuntimeDao = dataBaseHelper.getRuntimeDao(User.class);
}
//添加一个User到数据库
public void createUser(User user){
mRuntimeDao.createOrUpdate(user);
}
//从数据库中检索id为?的user
public List<User> queryUser(int id){
List<User> user = null;
try {
user = mRuntimeDao.queryBuilder().where().eq("id",id).query();
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
//清除数据库
public void clear(){
mRuntimeDao.delete(mRuntimeDao.queryForAll());
}
}
UserDao
五、ORMLite外键引用
创建一个Article类,需要知道这个Article所属的User,那么该怎么办。一般的方法,就是放入这个User的id,但是OrmLite可以放入整个User,这才是正确的面向对象程序。
所以要这么写:
public class Article {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String title;
@DatabaseField
private String content;
//声明这列为外键,不同于常规的数据库 外键设置的是User的id,这里直接将User设定为外键
@DatabaseField(canBeNull = true,foreign = true,columnName = "user_id")
private User user;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
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;
}
}
Article
public class ArticleDao {
private RuntimeExceptionDao mRuntimeDao;
private DataBaseHelper mDataBaseHelper;
//构造方法中获取Dao,用来操作数据库
public ArticleDao(Context context) {
mDataBaseHelper = DataBaseHelper.getHelper(context);
mRuntimeDao = mDataBaseHelper.getRuntimeDao(Article.class);
}
//添加一个Article到数据库
public void createUser(Article article){
mRuntimeDao.createOrUpdate(article);
}
//从数据库中检索id为?的Article,经过测试发现 只能获取到User的id,其他内容都是无法获取的
public Article queryArticle(int id){
Article article = null;
article = (Article) mRuntimeDao.queryForId(id);
return article;
}
//所以需要用该方法
public Article getArticleWithUser(int id){
Article article = queryArticle(id);
//获取到的article并没有User这个对象的内容,需要经过这一层赋值。
mDataBaseHelper.getRuntimeDao(User.class).refresh(article.getUser());
return article;
}
//根据user对象获取全部的Article
public List<Article> getArticles(int userId){
List<Article> articles = null;
try {
//发现userId的赋值跟int赋值一样
articles = mRuntimeDao.queryBuilder().where().eq("user_id",userId).query();
} catch (SQLException e) {
e.printStackTrace();
}
return articles;
}
//清除数据库
public void clear(){
mRuntimeDao.delete(mRuntimeDao.queryForAll());
}
ArticleDao
2、在user属性的注解上:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true)
添加foreignAutoRefresh =true,这样;当调用queryForId时,拿到Article对象则直接携带了user;
六:关联一个集合
每个User关联一个或多个Article,如果我在User中声明一个Collection<Article> articles,我能否在查询User的时候,一并能够获取到articles的值呢?
在User中添加如下属性,且注解如下:
@ForeignCollectionField
private Collection<Article> articles;
测试代码
User user = new UserDao(getContext()).get(1);
L.e(user.getName());
if (user.getArticles() != null)
for (Article article : user.getArticles())
{
L.e(article.toString());
}
User关联多个Article
注:id的自增是从1开始的 0 0
简便数据库——ORMLite框架的更多相关文章
- Android—Ormlite框架简单的操作数据库
大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...
- android数据库持久化框架, ormlite框架,
前言 Android中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样 ...
- Android ORMLite 框架的入门用法
大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...
- 数据库开源框架GreenDao的使用解析
数据库开源框架GreenDao的使用解析 1,GreenDao概述 1),greenDao是一个当下十分火热的数据库开源框架,或者说是一个帮助Android开发者将数据存到SQLite中的一个开源项目 ...
- android端的ormlite框架
安卓端有很多优秀的数据库框架来操作sqlite,如ormlite框架,这个框架可以用来实现表到对象的解析和转化. 使用: 首先去官网下载两个jar包,core和android(如果在安卓端开发的话), ...
- [开源].NET数据库访问框架Chloe.ORM
扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...
- 基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分。 http://www.makersoft.org
https://github.com/makersoft/mybatis-shards MyBatis-Shards 专业的MyBatis数据库切分框架 MyBatis Shards简介 MyBati ...
- [iOS]数据库第三方框架FMDB详细讲解
[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...
- “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象
目录: “Zhuang.Data”轻型数据库访问框架(一)开篇介绍 “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象 先来看一段代码 DbAccessor dba ...
随机推荐
- mysql创建存储过程
-- 创建CREATE PROCEDURE proDelAccountById(IN in_accountid int) BEGIN -- 执行sql预计 END -- 调用 ; CALL proDe ...
- Ecstore的微信账号绑定会员免登录
在微信公众号中通过消息交互/自定义菜单,可直接登录Ecstore手机商城.如果想用原商城账号登录,可以通过登录绑定,在后台可以获取登录绑定的链接这个链接可以在微信公众号消息交互场景或自定义菜单中使用, ...
- 22. Generate Parentheses
https://leetcode.com/problems/generate-parentheses/ 题目大意:给出n对小括号,求出括号匹配的情况,用列表存储并返回,例如:n=3时,答案应为: [ ...
- PASCAL的优越性:官方的说法(不需要Makefile,节约大量的时间)
也许你认为为什么我选择pascal代替其他的语言,像C.或者您会拿FreePascal和其他的pascal编译器作比较,那么好,这里您看看FreePascal为什么好: 1.pascal是一个非常简洁 ...
- g++ error: expected nested-name-specifier before 'XXX'
template <typename addrT=int,typename valuT=int,typename stream_addrT=bm_addr,typename stream_siz ...
- 关于DLL模块导出函数
当然以前我知道有一个.def文件的,里面写的都是需要导出的函数,以为与__declspec(dllexport)作用是一样的.但是今天看公司项目源码的时候才知道,它们两个导出方法是有一定的区别的,编译 ...
- xen vhd操作工具source code研读
推出最新的VHD操作工具VHD-UTIL 实现源码,超强,Ruiy只为学习高手的设计思路
- 《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章
<如何让TT T4模板输出多个文件(VS2010中)>-- access911.net 文章 问题: VS2010中自带的 TT 模板功能挺好用,但是如何定义其输出的目录,或者如何 ...
- 点击链接直接跳转到 App Store 指定应用下载页面
//跳转到应用页面 NSString *str = [NSString stringWithFormat:@"http://itunes.apple.com/us/app/id%d" ...
- 详细介绍Qt,ffmpeg 和SDL开发
Qt 与 ffmpeg 与 SDl 教程是本文要介绍的内容,从多个角度介绍本文,运用了qmake,先来看内容. 1. 注释 从“ #” 开始,到这一行结束. 2. 指定源文件 1. ...