Android 数据库框架ormlite 使用精要,万字总结

先说说优点

1. 轻量级

2. 使用简单,易上手

3. 封装完善

4. 文档全面

缺点

1. 基于反射,效率较低

2. 缺少中文翻译文档

如何使用?


导入jar包到项目libs文件夹下

http://ormlite.com/releases/下载相应版本的jar,下载最新的,目前是最新版本4.49。我们下载稳定的4.48即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daNhHjzM-1638255214761)(http://www.devilwwj.com/images/Snip20150602_3.png)]

继承OrmLiteSqliteOpenHelper类定义数据库帮助类

package com.devilwwj.ormlite.db;

import java.sql.SQLException;

import java.util.HashMap;

import java.util.Map;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import com.devilwwj.ormlite.model.Img;

import com.devilwwj.ormlite.model.PackageInfo;

import com.devilwwj.ormlite.model.Photographer;

import com.devilwwj.ormlite.model.Theme;

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;

/**

  • 功能:数据库帮助类

  • @author devilwwj

*/

public class DBHelper extends OrmLiteSqliteOpenHelper {

/**

  • 数据库名字

*/

private static final String DB_NAME = “test.db”;

/**

  • 数据库版本

*/

private static final int DB_VERSION = 1;

/**

  • 用来存放Dao的地图

*/

private Map<String, Dao> daos = new HashMap<String, Dao>();

private static DBHelper instance;

/**

  • 获取单例

  • @param context

  • @return

*/

public static synchronized DBHelper getHelper(Context context) {

context = context.getApplicationContext();

if (instance == null) {

synchronized (DBHelper.class) {

if (instance == null) {

instance = new DBHelper(context);

}

}

}

return instance;

}

/**

  • 构造方法

  • @param context

*/

public DBHelper(Context context) {

super(context, DB_NAME, null, DB_VERSION);

}

/**

  • 这里创建表

*/

@Override

public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {

// 创建表

try {

TableUtils.createTable(connectionSource, PackageInfo.class);

TableUtils.createTable(connectionSource, Photographer.class);

TableUtils.createTable(connectionSource, Theme.class);

TableUtils.createTable(connectionSource, Img.class);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 这里进行更新表操作

*/

@Override

public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion,

int newVersion) {

try

{

TableUtils.dropTable(connectionSource, PackageInfo.class, true);

TableUtils.dropTable(connectionSource, Photographer.class, true);

TableUtils.dropTable(connectionSource, Theme.class, true);

TableUtils.dropTable(connectionSource, Img.class, true);

onCreate(sqLiteDatabase, connectionSource);

} catch (SQLException e)

{

e.printStackTrace();

}

}

/**

  • 通过类来获得指定的Dao

*/

public synchronized Dao getDao(Class clazz) throws SQLException {

Dao dao = null;

String className = clazz.getSimpleName();

if (daos.containsKey(className)) {

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;

}

}

}

定义实体类Bean,代表一张表

创建上面用到的Bean,在ormlite中,它代表数据库中的一张表,我们所定义的所有成员变量均可为表中的字段,只要我们按照它提供的注解方式来指定成员变量属性。

举个栗子:

package com.devilwwj.ormlite.model;

import java.io.Serializable;

import com.j256.ormlite.dao.ForeignCollection;

import com.j256.ormlite.field.DatabaseField;

import com.j256.ormlite.field.ForeignCollectionField;

import com.j256.ormlite.table.DatabaseTable;

/**

  • 套餐

  • @author wwj_748

*/

@DatabaseTable

public class PackageInfo implements Serializable{

@DatabaseField(id = true)

public int id;

@DatabaseField

public String pid;

@DatabaseField

public String photographerId;

@DatabaseField

public String name;

@DatabaseField()

public int cost;

@DatabaseField

public String description;

@DatabaseField

public String detail;

// 一个套餐可以对应多个主题

@ForeignCollectionField(eager = true) // 必须

public ForeignCollection themes;

// 外部对象,一个套餐只对应一个摄影师,一个摄影师可以对应多个套餐

@DatabaseField(foreign = true)

public Photographer photographer;

@Override

public String toString() {

return “Package [id=” + id + “, pid=” + pid + “, photographerId=”

  • photographerId + “, name=” + name + “, cost=” + cost

  • “, description=” + description + “, detail=” + detail + “]”;

}

}

上面定义了一个套餐对象,我们来看一下它所用到的几个注解:

@DatabaseTable:表示定义了一个数据表,如果不指定名字,在Android中会以类名作为表名,如packageInfo就是SQLite数据库中的表名,我们也可以指定表名,@DatabaseTable(tableName = “tb_package”) 。

DatabaseField:表示定义了数据中的一个字段,id表示数据中的一个主键,如果指定为generatedId,表示自动增长id,我们不需要给它赋值。其他字段,可以使用columnName来指定字段名,canBeNull表示是否为空,这些赋值可以按照以下来指定

-(id = true, canBeNull = false)

- (columnName = “name”)

还有更多的注解用法,可以到官网查看它提供的文档,非常清楚详尽了,笔者这里不多说。

ormlite的外键约束(一对一、一对多、多对多关系)

使用这个框架需要比较注意的一点就是外键约束,这里笔者只讨论一对一、一对多的情况。

上一节我们定义了PackageInfo这个实体,里面有这样的定义:

// 一个套餐可以对应多个主题

@ForeignCollectionField(eager = true) // 必须

public ForeignCollection themes;

// 外部对象,一个套餐只对应一个摄影师,一个摄影师可以对应多个套餐

@DatabaseField(foreign = true)

public Photographer photographer;

这里就用到了外键的约束,我们来分析一下:

一个套餐对应多个主题:1:n的关系

一个套餐对应一个摄影师:1:1的关系

在n的一方,我们可以使用@ForeignCollectionField这样的注解,eager = true表示可以进行懒加载。

如果是一对一,我们还是用@DatabaseField注解,但要指定(foreign = true)表示是一个外键。

现在我们看一下多的一方是怎么定义的:

package com.devilwwj.ormlite.model;

import java.io.Serializable;

import com.j256.ormlite.dao.ForeignCollection;

import com.j256.ormlite.field.DatabaseField;

import com.j256.ormlite.field.ForeignCollectionField;

import com.j256.ormlite.table.DatabaseTable;

/**

  • 摄影主题

  • @author wwj_748

*/

@DatabaseTable

public class Theme implements Serializable{

@DatabaseField(id = true)

public String id;

@DatabaseField

public String tid;

@DatabaseField

public String photographerId;

@DatabaseField

public String packageId; // 隶属套餐

@DatabaseField

public String status; // 后台审核状态

@DatabaseField

public String title; // 标题

@DatabaseField

public String coverId; // 封面Id

@DatabaseField

public String coverUrl; // 封面img

@DatabaseField

public String detail; // 详情

@DatabaseField

public int photoCount; // 图片个数

@DatabaseField

public String photos; //图集

@DatabaseField

public String createTime; // 上传时间

@DatabaseField

public String recordTime; // 拍摄时间

@DatabaseField

public double cost; // 花费

@DatabaseField

public String tags; // 标签

@DatabaseField

public String address;// 地址

@DatabaseField

public String loacationCode; // 位置代码

@DatabaseF

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

ield

public int popularCount; // 热度

@DatabaseField(defaultValue = “0”)

public int favStatus; // 收藏状态

// 外部对象字段

@DatabaseField(foreign = true, foreignAutoRefresh = true)

public PackageInfo mPackage;

@DatabaseField(foreign = true, foreignAutoRefresh = true)

public Photographer photographer;

/**

  • 这里需要注意的是:属性类型只能是ForeignCollection或者Collection

  • 如果需要懒加载(延迟加载)可以在@ForeignCollectionField加上参数eager=false

  • 这个属性也就说明一个部门对应着多个用户

*/

@ForeignCollectionField(eager = true)

public ForeignCollection imgs;

}

我们这里不关注其他字段,关注它的外键字段,前面我们说到,一个套餐对应多个主题,所以我们在主题这个实体类中也需要定义一个关联套餐的字段。

// 外部对象字段

@DatabaseField(foreign = true, foreignAutoRefresh = true)

public PackageInfo mPackage;

注:要实现一对多关系,一定要这样定义,不然会出错。

定义Bean的DAO,对数据库进行增、删、改、查

这里笔者举个例子,大家以后开发根据这样来添加相应的业务逻辑方法:

package com.devilwwj.ormlite.dao;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import com.devilwwj.ormlite.db.DBHelper;

import com.devilwwj.ormlite.model.Theme;

import com.j256.ormlite.dao.Dao;

/**

  • 定义数据访问对象,对指定的表进行增删改查操作

  • @author devilwwj

*/

public class ThemeDao {

private Dao<Theme, Integer> themeDao;

private DBHelper dbHelper;

/**

  • 构造方法

  • 获得数据库帮助类实例,通过传入Class对象得到相应的Dao

  • @param context

*/

public ThemeDao(Context context) {

try {

dbHelper = DBHelper.getHelper(context);

themeDao = dbHelper.getDao(Theme.class);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 添加一条记录

  • @param theme

*/

public void add(Theme theme) {

try {

themeDao.create(theme);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 删除一条记录

  • @param theme

*/

public void delete(Theme theme) {

try {

themeDao.delete(theme);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 更新一条记录

  • @param theme

*/

public void update(Theme theme) {

try {

themeDao.update(theme);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 查询一条记录

  • @param id

  • @return

*/

public Theme queryForId(int id) {

Theme theme = null;

try {

theme = themeDao.queryForId(id);

} catch (SQLException e) {

e.printStackTrace();

}

return theme;

}

/**

  • 查询所有记录

  • @return

*/

public List queryForAll() {

List themes = new ArrayList();

try {

themes = themeDao.queryForAll();

} catch (SQLException e) {

e.printStackTrace();

}

return themes;

e.printStackTrace();

}

}

/**

  • 删除一条记录

  • @param theme

*/

public void delete(Theme theme) {

try {

themeDao.delete(theme);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 更新一条记录

  • @param theme

*/

public void update(Theme theme) {

try {

themeDao.update(theme);

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

  • 查询一条记录

  • @param id

  • @return

*/

public Theme queryForId(int id) {

Theme theme = null;

try {

theme = themeDao.queryForId(id);

} catch (SQLException e) {

e.printStackTrace();

}

return theme;

}

/**

  • 查询所有记录

  • @return

*/

public List queryForAll() {

List themes = new ArrayList();

try {

themes = themeDao.queryForAll();

} catch (SQLException e) {

e.printStackTrace();

}

return themes;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值