准备工作–创建数据库及数据表
ORMlite通过Java注解的方式来建立起与数据库的映射关系,在这里我们以一个实例来进行说明,如我们现在想要建立一个简单的数据库test.db并创建一张表person来记录一个人的名字,年龄,住址等等。
创建Bean类
首先,建立我们的Bean类Person,并通过注解的方式与数据库联系起来
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
|
@DatabaseTable
(tableName =
"person"
)
public
class
Person {
@DatabaseField
(generatedId=
true
)
private
int
id;
@DatabaseField
(columnName=
"name"
)
private
String name;
@DatabaseField
(columnName=
"age"
)
private
int
age;
@DatabaseField
(columnName=
"address"
)
private
String address;
/**
* @return the id
*/
public
int
getId() {
return
id;
}
/**
* @param id the id to set
*/
public
void
setId(
int
id) {
this
.id = id;
}
/**
* @return the name
*/
public
String getName() {
return
name;
}
/**
* @param name the name to set
*/
public
void
setName(String name) {
this
.name = name;
}
/**
* @return the age
*/
public
int
getAge() {
return
age;
}
/**
* @param age the age to set
*/
public
void
setAge(
int
age) {
this
.age = age;
}
/**
* @return the address
*/
public
String getAddress() {
return
address;
}
/**
* @param address the address to set
*/
public
void
setAddress(String address) {
this
.address = address;
}
}
|
在这里我们创建了Bean类,并与数据库建立了联系,有两件事是我们需要做的
1.需要在@DatabaseTable注解中填入表名
2.在@DatabaseField(columnName=”“)填入字段名,设置字段的属性等等
字段属性说明
ORMLite为我们提供了全面的字段属性的支持,下面我们来具体看一下吧:
- cloumnName:指定字段名,不指定则变量名作为字段名
- canBeNull:是否可以为null
- dataType:指定字段的类型
- foreign 指定这个字段的对象是一个外键,外键值是这个对象的id
- foreignAutoCreate 外键不存在时是否自动添加到外间表中
- foreignAutoRefresh 外键值,自动刷新
- foreignColumnName外键字段指定的外键表中的哪个字段
- generatedId:指定字段为自增长的id,不能id,generatedIdSequence通用
- id:指定字段为id
- index:索引
- persisted:指定是否持久化此变量,默认true
- throwIfNull,如果空值抛出异常
- useGetSet:指定ormlite访问变量使用set,get方法默认使用的是反射机制直接访问变量
- unique:字段值唯一
- uniqueIndex 唯一索引
- uniqueCombo整列的值唯一
创建数据库
与Android中的数据库创建相似,使用OrmLite创建数据库需要我们创建一个SqlOpenHelper继承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有两个重要方法,分别是onCreate和onUpgrade,负责数据库创建以及升级时的操作
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
|
public
class
MySqlOpenHelper
extends
OrmLiteSqliteOpenHelper {
private
Dao<Person, Integer> mPersonDao;
public
MySqlOpenHelper(Context context) {
super
(context,
"test"
,
null
,
1
);
// TODO Auto-generated constructor stub
}
@Override
public
void
onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
// TODO Auto-generated method stub
try
{
//创建数据表
TableUtils.createTableIfNotExists(arg1, Person.
class
);
}
catch
(java.sql.SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public
void
onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1,
int
arg2,
int
arg3) {
// TODO Auto-generated method stub
}
public
Dao<Person, Integer> getPersonDao()
throws
java.sql.SQLException {
if
(mPersonDao ==
null
) {
mPersonDao = getDao(Person.
class
);
}
return
mPersonDao;
}
}
|
Dao是一个很重要的类, 这些Dao对象用于以后的数据库操作,其包含两个泛型,第一个泛型表DAO操作的类,第二个是标记数据表的ID。
数据库操作
创建了我们自己的数据库之后就可以来,对数据库操作了,接下来我们看看如何进行数据库的增删查改
插入操作
这些方法使用起来都比较简单,我们只需将自己的Bean传入到下列方法中即可
- create:插入一条数据
- createIfNotExists:如果不存在则插入
- createOrUpdate:如果存在则更新
查询操作
OrmLite为我提供了一系列的查询操作,方法很多,而且很多都是只看方法名就可以知道的,这里就不逐一介绍了,在这里介绍一下如何使用QueryBuilder进行复杂查找。
- 首先调用personDao.queryBuilder();获得该Dao下的QueryBuilder对象,
- 接下来设置QueryBuilder的查询条件,
- 最后通过QueryBuilder的query方法获得List对象,
下面介绍几个常用的builder下的查询,
1.多字段条件查询:
1
2
3
|
QueryBuilder builder = dao.queryBuilder();
builder.where().eq(
"字段名1"
,
"条件1"
).and.eq(
""
字段名
2
","
条件
2
");
builder.query();
|
2.查询并按顺序输出
1
2
3
|
QueryBuilder<Person, Integer> builder = dao.queryBuilder();
builder.orderBy(
"字段名"
,
true
);
builder.query();
|
orderBy的方法第一参数表示按那个字段进行排序,第二个参数表示是否为升序。
3.分页查询
1
2
3
4
|
QueryBuilder<Person, Integer> builder = dao.queryBuilder();
builder.offset(
10
);
//表示查询的起始位置
builder.limit(
10
);
//表示总共获取的对象数量
builder.query();
|
删除和更改操作
与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似,就不详细介绍了。
将数据库放置在SD卡
Android创建数据库默认的存储路径是在/data/data/packagename/database 目录之下,一方面如果数据库庞大将占用系统存储空间,另一方面如果没有获得系统ROOT权限,将不能直观的看到该数据库。所以在最后介绍一下如何将数据库建立在指定的SD卡目录之下。
这个在ORMLite中并没有提供,自己来动手写一写吧。阅读一下Android的源码可以很容易发现,Android数据库存放的目录是由ContextWrapper类下的public File getDatabasePath(String name)方法决定的,那么我们只需创建自己的Context覆盖该方法即可。
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
|
public
class
DatabaseContext
extends
ContextWrapper {
private
static
final
String ROOT_SDCARD = Environment
.getExternalStorageDirectory().getAbsolutePath();
private
String dbDir;
public
DatabaseContext(Context base, String path) {
super
(base);
dbDir = path;
}
@Override
public
File getDatabasePath(String name) {
// 判断是否存在sd卡
boolean
sdExist = android.os.Environment.MEDIA_MOUNTED
.equals(android.os.Environment.getExternalStorageState());
if
(!sdExist) {
// 如果不存在,
Log.e(
"Database error"
,
"SD卡不存在"
);
return
null
;
}
// 判断目录是否存在,不存在则创建该目录
File dirFile =
new
File(dbDir);
if
(!dirFile.exists())
dirFile.mkdirs();
// 标记数据库文件是否创建成功
boolean
isFileCreateSuccess =
false
;
String dbPath = dbDir +
"/"
+ name;
// 数据库路径
File dbFile =
new
File(dbPath);
// 如果数据库文件不存在则创建该文件
if
(!dbFile.exists()) {
try
{
isFileCreateSuccess = dbFile.createNewFile();
// 创建文件
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
isFileCreateSuccess =
true
;
// 返回数据库文件对象
if
(isFileCreateSuccess)
return
dbFile;
else
return
null
;
}
@Override
public
SQLiteDatabase openOrCreateDatabase(String name,
int
mode,
SQLiteDatabase.CursorFactory factory) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
getDatabasePath(name),
null
);
return
result;
}
/**
* Android 4.0会调用此方法获取数据库。
*
*/
@Override
public
SQLiteDatabase openOrCreateDatabase(String name,
int
mode,
CursorFactory factory, DatabaseErrorHandler errorHandler) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
getDatabasePath(name),
null
);
return
result;
}
}
|
之后我们在创建SQLOpenHelper时,只需传入我们自己的DatabaseContext 即可,如
1
2
|
SdCardDBHelper dbHelper =
new
SdCardDBHelper(
new
DatabaseContext(
MainActivity.
this
, path),
"person.db"
);
|
ORMLite相关文件下载
附上ORMLite相关jar文件以及官方文档说明:点击下载