实习周记第五周之ormlite

Posted by Chejdj Blog on September 18, 2018

这一篇主要记录一下自己在实际项目开发中,如何使用Ormlite这个第三方库,Android的数据库是一般SQLite数据库,我们在开发中当然我们自己去实现SqliteOpenHelper来帮助我们来管理数据库(负责创建和更新数据库),然后自己写一个DBmanager,通过SqliteOpenHelper来获取DataBase数据库,但是当项目中表格越来越庞大,比较难维护,开发起来也比较容易,所以一般是采用Sqlite的框架,常见的操作SQLite数据库的框架有:Ormlite,GreenDao.

步骤一 创建数据库表

ormlite采用的注解的方式来创建数据库表的表名,字段的,常见的几个用法是:
@DatabaseTable(tableName = "user") 在Java类的上面标注,代表数据表名字,可选,不指定,系统默认使用带有规范化的Java类的类名
@DatabaseField(...) 代表数据库中的字段
@ForeignCollectionField(...) 一对多的关联,表示比如一个User关联多个Car
@DatabaseField注释包含的字段
id : 当前字段是不是id字段,默认为false,只有一个类中只有一个字段可以这么设置,Id字段唯一标识一行,后期可能需要使用ID方法查询,更新,刷新,删除(Id属性默认添加索引)
columnName : 表示当前属性在表中代表哪个字段
generatedId : 表示设置的属性值在数据库中数据是否自增
defaultValue : 表示设置字段的默认值
width: 字段的宽度,主要用于字符串字段。默认值为0
canBeNull : 是否可以为空,默认为true
generatedId : 该字段是否为自动生成的id字段。默认值为false,只有一个字段可以在一个类中设置此设置,这告诉数据库为插入的每一行自动生成相应的id.
generatedIdSequence: 用于生成此值的序列号的字符串名称。与之相同,generatedId但您可以指定要使用的序列名称。默认为none,一个类只有一个字段可以设置。(如果您使用generatedId,则代码将自动生成序列名称)
foreign: 将此字段标识为对应于同样存储在数据库中的另一个类
index 布尔值(默认为false),让数据库为此字段添加索引
举一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
@DatabaseTable(tableName = OgaImageUrlRecord.TABLE_NAME)
public class OgaImageUrlRecord implements Parcelable {
    public static final String TABLE_NAME = "ogaimageurlrecord";
    public static final String REMOTEID_COLUMN_NAME = "remoteid";
    public static final String IMAGEURL_COLUMN_NAME = "url";
    public static final String INSERT_TIME = "insertTime";

    @DatabaseField(id = true, columnName = REMOTEID_COLUMN_NAME)
    private long remoteId;
    @DatabaseField(columnName = IMAGEURL_COLUMN_NAME)
    private String imageUrl;
    @DatabaseField(columnName = INSERT_TIME)
    private Date insertTime;

    public OgaImageUrlRecord() {
    }

    public long getRemoteId() {
        return remoteId;
    }

    public void setRemoteId(long remoteId) {
        this.remoteId = remoteId;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }

    public Date getInsertTime() {
        return insertTime;
    }

    public void setInsertTime(Date insertTime) {
        this.insertTime = insertTime;
    }

    protected OgaImageUrlRecord(Parcel in) {
        remoteId = in.readLong();
        imageUrl = in.readString();
        insertTime=new Date(in.readLong());
    }

    public static final Creator<OgaImageUrlRecord> CREATOR = new Creator<OgaImageUrlRecord>() {
        @Override
        public OgaImageUrlRecord createFromParcel(Parcel in) {
            return new OgaImageUrlRecord(in);
        }

        @Override
        public OgaImageUrlRecord[] newArray(int size) {
            return new OgaImageUrlRecord[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(remoteId);
        dest.writeString(imageUrl);
        dest.writeLong(insertTime.getTime());
    }

    @Override
    public String toString() {
        return "OgaImageUrlRecord{" +
                "mediaId= " + remoteId + '\'' +
                "imageUrl= " + imageUrl + '\'' +
                "insertTime= " + insertTime + '\'' +
                "}";
    }
}

步骤二 配置Dao

Dao(Database access object): 数据库访问对象,每一个Dao处理单个持久化类的所有操作。

1
2
3
4
5
6
7
8
public DAO<OgaImageUrlRecord, Long> getOgaImageUrlRecordDao() {
        try {
            return DaoManager.createDao(getConnectionSource(), OgaImageUrlRecord.class);
        } catch (SQLException e) {
            LogHelper.e(TAG, "getOgaImageUrlRecordDao  get dao erro", e);
            return null;
        }
}

调用它本身的DaoManager.createDao,它本身会查找内存的是否有该对象进行复用

  1. Dao中含有两个参数: 一个使用DAO持久化的类,第二个是标识特定数据库行的ID列(id=true)
    注意:创建DAO是一个非常昂贵的操作,应该重用DAO,当然原本的库中就已经封装好了

步骤三 创建数据库

使用TableUtils类,来创建,删除表,在继承OrmLiteSqliteOpenHelper该类的onCreate方法中去创建
TableUtils.createTableIfNotExists(connectionSource, OgaImageUrlRecord.class);

步骤四 数据库的增删改查

利用之前我们配置生成的DAO,看代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static OgaImageUrlRecord getOgaImageUrlRecord(long mediaId) {
        try {
            IBaseDAO<OgaImageUrlRecord, Long> imageUrlRecordDao = OgaDbHelper.getInstance().getOgaImageUrlRecordDao();
            List<OgaImageUrlRecord> list;
            QueryBuilder<OgaImageUrlRecord, Long> queryBuilder = imageUrlRecordDao.queryBuilder();
            queryBuilder.where()
                    .eq(OgaImageUrlRecord.REMOTEID_COLUMN_NAME, mediaId);

            list = imageUrlRecordDao.query(queryBuilder.prepare());

            return list != null && list.size() > 0 ? list.get(0) : null;
        } catch (SQLException e) {
            LogHelper.e(TAG, "query imageUrlTable failed", e);
        }
        return null;
    }  

当然也可以用原生的sql语句
GenersicRawResults<String[]> rawResults =orderDao.queryRaw("" )
具体这部分可以参考一下官方文档