这一篇主要记录一下自己在实际项目开发中,如何使用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,它本身会查找内存的是否有该对象进行复用
- 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("" )
具体这部分可以参考一下官方文档