android ormlite 监听,在Android开发中使用ORMLite--篇一

前言

在android开发中,数据需要本地存储,当需要进行一系列的操作时,当然是使用sqlite。标准做法是继承SQLiteOpenHelper,重写onCreate和onUpdate方法。存在比较大的问题是,sql语句需要自己写,比较复杂繁琐而且重复率高,于是找了一个orm框架在新写的app中进行试用。

准备

下载地址:http://ormlite.com/releases/

下载core和android两个jar包,并引入工程即可

开发

模型注解

首先定义一个最常见的人员模型

// tableName定义表名,缺省为类名

@DatabaseTable(tableName = "table_person")

public class Person{

@DatabaseField(generatedId = true)

private int id;

// columnName定义字段名,缺省为变量名

@DatabaseField(columnName = "first_name")

private String firtName;

@DatabaseField

private String lastName;

// 需要定义一个无参构造函数,ormlite用来查询时用反射构建对象

public Person() {

}

// other constructors...

// getters and setters...

}

@DatabaseField注解域说明如下:

官网原文

名称

数据类型

默认值

说明

columnName

String

字段名,缺省为变量名

dataType

String

设置DataType即字段类型,通常不用指定,对应到SQL type

defaultValue

String

默认值,默认为空

width

Integer

通常用在字符串域。默认是0,意思是默认长度。字符串默认255

canBeNull

Boolean

true

是否可空

id

Boolean

false

指定该域是否为id,一个类只能有一个域设置此

generatedId

Boolean

false

该域是否为自动生成id域,一个类一个类只能有一个域设置此

generatedIdSequence

String

指定序列。从1开始,每次自增1

foreign

Boolean

false

指定该域是否对应另一个类,另一个类必须有id域

useGetSet

Boolean

false

是否需要通过get和set方法访问,通过java反射访问

unknownEnumName

String

如果该域为java枚举类型,可以指定一个枚举值,当数据库行的值没有在枚举类型中时,则使用此值

throwIfNull

Boolean

false

当字段为空进行插入时,ORMLite会抛出异常

persisted

Boolean

true

设置为false时,不存入数据库

format

unique

Boolean

false

列唯一性

uniqueCombo

Boolean

false

联合列唯一性

index

Boolean

false

建立索引,索引名默认为列名加后缀_idx

uniqueIndex

Boolean

false

建立唯一索引,在此索引中的所有值都是唯一的

indexName

String

none

指定索引名,则不需要另外指定index布尔值。为了在一个索引中索引多个域,每个域需要有相同的indexName

uniqueIndexName

String

none

指定唯一索引名称,在此索引中的所有值都是唯一的

foreignAutoRefresh

Boolean

false

外键自动刷新

maxForeignAutoRefreshLevel

allowGeneratedIdInsert

Boolean

false

如果设置为true,当插入包含id域的对象时,不会自动生成id域覆盖

columnDefinition

foreignAutoCreate

version

Boolean

false

foreignColumnName

String

指定外键对象关联域

完成Helper

与原生的SQLiteOpenHelper相似,使用ORMLite需要继承OrmLiteSqliteOpenHelper,如下:

public class DBHelper extends OrmLiteSqliteOpenHelper {

private DBHelper(Context context) {

super(context, TABLE_NAME, null, VERSION);

}

// 创建表在这里就非常简单了,使用TableUtils的createTable方法即可,不需要写CREATE TABLE等等的sql语句。

@Override

public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {

try {

TableUtils.createTable(connectionSource, Person.class);

} catch (SQLException e) {

e.printStackTrace();

}

}

// 重写onUpdate方法

@Override

public void onUpgrade(SQLiteDatabase database,

ConnectionSource connectionSource, int oldVersion, int newVersion) {

try {

// 删除旧表再新建表,也可以对表进行相应的更新操作

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

onCreate(database, connectionSource);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

获取Dao

对于orm来说,dao是用于数据库操作的通常做法。在Helper中加入如下代码:

// 声明静态实例

private static DBHelper instance;

// 声明dao

private Dao personDao;

/** * 单例获取该Helper * *@param context *@return */

public static synchronized DBHelper getHelper(Context context) {

context = context.getApplicationContext();

if (instance == null) {

synchronized (DatabaseHelper.class) {

if (instance == null)

instance = new DatabaseHelper(context);

}

}

return instance;

}

// 获取某个dao,有多个表的情况,可能需要写多个获取dao的方法

public Dao getPersonDao() throws SQLException {

if (personDao == null) {

personDao = getDao(Person.class);

}

return personDao;

}

// 释放资源

@Override

public void close() {

super.close();

personDao = null;

}

// 另外也可以有通用方法

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;

}

单独创建dao类

public class PersonDao {

private Context context;

public PersonDao(Context context) {

this.context = context;

}

public void add(Person person) {

try {

DBHelper.getHelper(context).getPersonDao().create(person);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

使用

准备好后,使用起来也非常方便

// 获取helper

DBHelper helper = DBHelper.getHelper(getContext());

// 构造

Person xiaoming = new Person();

xiaoming.setFirstName("Ming");

xiaoming.setLastName("Xiao");

// 保存

helper.getPersonDao().create(xiaoming);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值