OrmLite-更符合面向对象的数据库操作方式

1. jar包下载

下载地址:http://ormlite.com/releases/,一般用core和android包即可。

如果使用的是android studio,也可以直接通过module settings加入依赖。

2. 实体类

使用OrmLite创建表不需要写任何SQL语句,而是通过创建一个对应的实体类,通过这一实体类建表,即一张表对应一个实体类,而数据表中的字段以及字段属性则通过给实体类的属性添加注解进行设置。这也就是OrmLite比起安卓原生的数据库操作方式更符合面向对象思想的地方。

需要注意的是,实体类必须有无参的构造函数,否则会报错。

常用注解:

@DatabaseTable(tableName="table_name"):加在类定义前,设置表名,不设置则默认表名为实体类的类名。

@DatabaseField:实体类的属性前若加了这个注解,则该属性作为数据表的字段,不加的话,创建数据表时则忽略该属性。

常用参数有:generatedId:true则声明该字段为主键并自动增长;

columnName:设置字段名,不设置则默认同属性名;

dataType:设置数据类型,不设置则同属性类型,类型定义在DataType中;

canBeNull:设置字段是否允许为空,默认为true;

unique:添加唯一约束;

foreign:设置该字段为外键,一般是引用另一个实体类的ID。比如A实体类中有一个属性B,而数据库中是没有B这样一个数据类型的,则通过外键形式存储B的ID;

foreignAutoRefresh:外键自动更新;

foreignAutoCreate:外键不存在时是否自动添加;

foreignColumnName:指定作为外键的字段,不设置则默认为主键列。

@ForeignCollectionField:自动把所有参照本类的外键元素加入。比如Company公司类有个属性Collection employees记录公司所有员工,而Employee类中有个外键属性参照Company类,那么在添加数据的时候会自动把所有参照了这一ID的员工全部加进来,而不需要手动添加。

@DatabaseTable(tableName = "tb_student")
public class Student {

    @DatabaseField(generatedId = true)
    private int id;
    
    @DatabaseField(columnName = "stu_name", dataType = DataType.STRING, canBeNull = false)
    private String name;
    
    @DatabaseField
    private int age;
    
    @DatabaseField
    private String phone;

    public Student(String name, int age, String phone) {
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    // 若添加了有参的构造方法,则必须添加显性的无参构造方法
    public Student() {}

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

3. 数据库帮助类

定义了实体类之后,就要写一个帮助类进行创建和更新数据库,继承自OrmLiteSqliteOpenHelper,最好为单例模式。

继承的类与SQLiteOpenHelper基本一致,不同的是,OrmLiteSqliteOpenHelper为我们提供了一个TableUtils类进行数据表的添加与删除操作,更加简便,也更加符合面向对象的思想:

创建表:TableUtils.createTable(ConnectionSource connectionSource, Class<? extends Object> dataClass)

删除表:TableUtils.dropTable(ConnectionSource connectionSource, Class<? extends Object> dataClass, boolean igoreErrors)

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private final static int DATABASE_VERSION = 1;

    private static DatabaseHelper sHelper;

    private DatabaseHelper(Context context) {
        super(context, "test.db", null, DATABASE_VERSION);
    }

    // 单例模式
    public static synchronized DatabaseHelper getInstance(Context context) {
        if (sHelper == null) {
            sHelper = new DatabaseHelper(context);
        }
        return sHelper;
    }

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        try {
            // 创建表,传入连接源与实体类
            TableUtils.createTable(connectionSource, Person.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
    }
}

4. 数据库操作类

OrmLite专门封装了一个Dao类对数据库中的数据进行操作,每操作一个数据表,则通过帮助类对象调用getDao()方法获取相应的Dao对象,类型需指定两个泛型,第一个是相应的实体类,第二个是ID的数据类型,例如Dao<Person, Integer> dao = helper.getDao(Person.class);

插入

(1)dao.create():参数是相应的实体类对象。

Person p = new Person("Tim", "男", 22);
dao.create(p);

(2)dao.createOrUpdate():插入或更新,即插入记录ID存在时则更新数据。

(3)dao.createIfNotExists():如果插入记录不存在则插入。

更新:更新的方法有两种,第一种是直接调用SQL语句,第二种是通过UpdateBuilder对象实现。

(1)通过dao.updateRaw(String statement, String... arguments):直接调用原生SQL语句,第一个参数为SQL语句,后面的可变参数为占位符对应的值。

dao.updateRaw("update tb_name set name = ?, age = ? where id = ?", "Tim", 22, 2);

(2)通过UpdateBuilder实现:

设置条件的常用函数有:eq()某字段等于多少、gt()大于多少、lt()小于多少、and()并且、or()或者...等等。根据英文记忆比较容易,例如大于gt()->greater than、小于lt()->less than。

// 获取UpdateBuilder对象
UpdateBuilder builder = dao.updateBuilder()
// 设置更新范围
builder.setWhere(update.where().eq("id", 1).or().gt("age", 16));// id等于1或者age大于16
// 设置更新值
builder.updateColumnValue(...)
// 更新
builder.update()

查询:查询的方法有很多种,这里介绍几种比较常用的:

(1)dao.queryForAll():查询全部记录,不需要参数,相当于SQL中的select * from tb_name;

(2)dao.queryForEq(String fieldName, Object value):根据某字段的值查询,第一个参数为字段名,第二个参数为值。

List<Person> persons = dao.queryForEq("name", "Tim");

(3)dao.queryForId(Integer id):根据id查询。

PS:查询也可以通过类似于更新的方法,使用QueryBuilder进行查询。

删除:删除的方法也有多种,可以通过delete()方法传入实体类对象删除相应记录,可以通过deleteById()传入id进行删除,也可以类似更新的方法,通过DeleteBuilder对象进行删除。

5. 事务

通过OrmLite使用事务时,直接把内容装进下面的回调函数中即可,Callable的泛型指定返回值的类型,不需要返回值则传入Void。

TransactionManager.callInTransaction(helper.getConnectionSource(), 
    new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            // 需要在事务中进行的操作
        }
    });
posted @ 2017-08-30 20:14  jyau  阅读(1273)  评论(0编辑  收藏  举报