在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<Person, Integer> 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<Person, Integer> 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);
时间: 2024-08-27 11:27:11

在Android开发中使用ORMLite--篇一的相关文章

Android开发中常用的ListView列表的优化方式ViewHolder

在Android开发中难免会遇到大量的数据加载到ListView中进行显示, 然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需 求变化ListView'条目中的内容是越来越多这就需要程序员来自定义适配器, 而关键的就是适配器的优化问题,适配器没有优化好往往就会造成OOM (内存溢出)或者是滑动卡顿之类的问题,接下来我就给大家介绍一种常 用的Adapter优化方法 1 /** 2 * list View的适配器 3 */ 4 class Adapter extends Bas

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android开发中的MVP架构(转)

写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn=1cd10bd9efaac7083575367a8b4af52f&scene=1&srcid=0910ARzPpBvVYPI1NDBZnixa#wechat_redirect 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android开发中无处不在的设计模式——单例模式

对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的同学,这里推荐2本书.一本是Head First系列的Head Hirst Design Pattern,英文好的可以看英文,可以多读几遍.另外一本是大话设计模式. 这篇文章介绍一个模式,就是单例模式,因为个人觉得这个模式理解起来最容易,而且不是太复杂. 首先了解一些什么是单例,从名字中就可以听出来

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写.后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列文章.前面介绍了三个模式. Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 本篇文章介绍的模式其实很简单,即原型模式,按照惯例,先看定义. 用原型实例指定创建对象的种类,并通过拷贝

Android 开发中的日常积累

欢迎Star,Fork https://github.com/lizhangqu/CoreLink 里面记录了开发过程中有用的东西,欢迎补充,不定时更新. Android 性能优化 Android内存优化之OOM Android最佳性能实践(1):合理管理内存 Android最佳性能实践(2):分析内存的使用情况 Android最佳性能实践(3):高性能编码优化 Android最佳性能实践(4):布局优化技巧 Android 加固与反编译 Apktool dex2jar DecompileApk

MVP模式在Android开发中的最佳实践

这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁今天有空,撸撸完. 回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Controller,或许那个时候,你没有什么深刻的体会.随着经验的积累.你发现,Activity既是Controller,掌管着许许多多的业务逻辑,同时它也作为View的一部分,控制着视图层的显示.久而久之,这个Controller便显得过于重,职责不再那么单一. 于是,再后来,为了使Activity的职

Android开发中无处不在的设计模式——策略模式

这个系列停更了好久了,差不多可以重新拿起来更一篇了,这篇文章主要介绍策略模式.在这之前,先温习一下前面介绍的4种模式. 设计模式很重要! 设计模式很重要! 设计模式很重要! 重要的事说三遍!!! Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 Android开发中无处不在的设计模式--原型模式 接着看下策略模式的定义 策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它

Android开发中,那些让你觉得相见恨晚的方法、类或接口

本篇文章内容提取自知乎android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常见.大多数的函数自己还是见过的,这里记录一下备忘.同时呢,也推荐一个github项目,里面记录了自己日常开发中见过的比较有用的东西开发中常用的工具.链接 Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方法g