Sqlite是一种轻量级的嵌入式关系数据库,比一般的Mysql等速度更快,更适合在移动轻型移动设备上使用。它支持基本所有的Sql语句,使用非常方便。
在Android系统中,我们使用SqliteDatabase 的API来对其进行调用。本文就来介绍一下数据库的创建以及使用sql语句对数据库进行基本操作。
本文例子中建立了一个person的数据库,有3个字段,分别为id,name,numer,其中后两项为String类型。
首先是数据库的建立,我们新建一个PersonSQLiteOpenHelper去继承SQLiteOpenHelper,注释中解释了构造方法参数的含义.
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
|
package
com.xgezhang.sqlitetest;
import
android.content.Context;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteDatabase.CursorFactory;
import
android.database.sqlite.SQLiteOpenHelper;
public
class
PersonSQLiteOpenHelper
extends
SQLiteOpenHelper {
/**
* 数据库构造方法
* @param context 告诉程序数据库创建在哪一个目录下
* @param name 数据库文件的名字
* @param factory 数据结果集游标,null为默认
* @param version 数据库版本,从1开始
*/
public
PersonSQLiteOpenHelper(Context context) {
super
(context,
"Person.db"
,
null
,
1
);
// TODO Auto-generated constructor stub
}
/**
*数据库第一次被创建时调用的方法
*/
@Override
public
void
onCreate(SQLiteDatabase db) {
//初始化数据库表结构
//嵌入式SQLite 底层存放数据都是已string方式存放
db.execSQL(
"create table person (id integer primary key autoincrement , name varchar(20) , number varchar(20))"
);
}
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
// TODO Auto-generated method stub
}
}
|
为了测试方便,我们建立了一个AndroidTestCase,首先测试一下数据库的建立是否成功:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.xgezhang.sqlitetest.test;
import
java.util.List;
import
com.xgezhang.sqlitetest.PersonSQLiteOpenHelper;
import
android.test.AndroidTestCase;
public
class
TestPersonDB
extends
AndroidTestCase {
public
void
createDB()
throws
Exception {
PersonSQLiteOpenHelper helper =
new
PersonSQLiteOpenHelper(getContext());
helper.getWritableDatabase();
}
}
|
运行测试代码,之后,我们可以打开DDMS的文件系统,查看/data/data/yourAppPackage/目录,如果生成成功,会出现一个databases文件夹,里面就有我们刚才创建的person.db文件。
SqlHelper的onCreate函数只在第一次执行的时候才创建,之后就不会再运行这段代码了。
接下来我们来看看如何对数据库进行操作,常见的操作无异于以下几种:
1.插入操作 insert
2.查找指定内容操作 select . where .
3.删除条目操作 delete . where .
4.更改条目 update .set . where .
5.查找所有 select * from person
为了代码的规范性,我们先定义好person的业务bean单元,新建package com.xgezhang.splitetest.domain,设置好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
|
package
com.xgezhang.sqlitetest.domain;
public
class
Person{
private
int
id;
private
String name;
private
String numberString;
public
Person() {
}
public
Person(
int
id, String name, String numberString) {
super
();
this
.id = id;
this
.name = name;
this
.numberString = numberString;
}
@Override
public
String toString() {
return
"Person [id="
+ id +
", name="
+ name +
", numberString="
+ numberString +
"]"
;
}
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
String getNumberString() {
return
numberString;
}
public
void
setNumberString(String numberString) {
this
.numberString = numberString;
}
}
|
然后新建一个dao(database access object)的package,写好类来对数据库进行操作,主要就是前面说到的几点。其中db.execSQL语句可以用来执行对应的SQL语句。而相应的查找则使用rawQuery函数来执行。二者都使用了带占位符的函数方式:
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
81
82
83
84
85
86
87
|
package
com.xgezhang.sqlitetest.dao;
import
java.io.Closeable;
import
java.util.ArrayList;
import
java.util.List;
import
android.content.Context;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import
com.xgezhang.sqlitetest.PersonSQLiteOpenHelper;
import
com.xgezhang.sqlitetest.domain.Person;
public
class
PersonDao {
private
PersonSQLiteOpenHelper helper;
public
PersonDao(Context context) {
helper =
new
PersonSQLiteOpenHelper(context);
}
/**
* 添加一条记录到数据库
* @param name 姓名
* @param number 电话
*/
public
void
add(String name,String number){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(
"Insert into person(name,number) values (?,?)"
,
new
Object[] {name,number});
db.close();
}
/**
* 查询记录是否存在
* @param name 姓名
* @return boolean类型,true存在 false不存在
*/
public
boolean
find(String name){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery(
" select * from person where name = ?"
,
new
String[] {name});
boolean
bool = cursor.moveToNext();
cursor.close();
db.close();
return
bool;
}
/**
*修改一条记录
* @param name 要修改的人的姓名
* @param number 修改后的新的号码
*/
public
void
update(String name,String newNumber){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(
"update person set number = ?' where name= ?"
,
new
Object[] {newNumber,name});
db.close();
}
/**
* 删除一条数据
* @param name 要删除的条目的姓名
*/
public
void
delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(
"delete from person where name = ?"
,
new
String[] {name});
db.close();
}
/**
* 返回全部的数据库信息
* @return
*/
public
List<Person> findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery(
"select * from person"
,
null
);
List<Person> persons =
new
ArrayList<Person>();
while
(cursor.moveToNext()){
int
id = cursor.getInt(cursor.getColumnIndex(
"id"
));
String name = cursor.getString(cursor.getColumnIndex(
"name"
));
//根据数据库栏的名字来获取对应的index ,增强程序的易读性
String number = cursor.getString(cursor.getColumnIndex(
"number"
));
Person p =
new
Person(id,name,number);
persons.add(p);
}
cursor.close();
db.close();
return
persons;
}
}
|
注意一点,在查找的时候返回的cursor指向的是查找结果的最上面一行(即第一行数据的上面),我们可以用cursor.moveToNext() cursor.moveToPosition()等方法获取到需要的值。
写好以后,我们继续完善我们的TestCase:
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
|
package
com.xgezhang.sqlitetest.test;
import
java.util.List;
import
com.xgezhang.sqlitetest.PersonSQLiteOpenHelper;
import
com.xgezhang.sqlitetest.dao.PersonDao;
import
com.xgezhang.sqlitetest.domain.Person;
import
android.test.AndroidTestCase;
public
class
TestPersonDB
extends
AndroidTestCase {
public
void
createDB()
throws
Exception {
PersonSQLiteOpenHelper helper =
new
PersonSQLiteOpenHelper(getContext());
helper.getWritableDatabase();
}
public
void
testAdd()
throws
Exception{
PersonDao dao =
new
PersonDao(getContext());
dao.add(
"lisi"
,
"123"
);
}
public
void
testFind()
throws
Exception{
PersonDao dao =
new
PersonDao(getContext());
boolean
result = dao.find(
"lisi"
);
assertEquals(
true
, result);
}
public
void
testDelete()
throws
Exception{
PersonDao dao =
new
PersonDao(getContext());
dao.delete(
"lisi"
);
}
public
void
testUpdate()
throws
Exception{
PersonDao dao =
new
PersonDao(getContext());
dao.update(
"lisi"
,
"123456"
);
}
public
void
testFindAll()
throws
Exception{
PersonDao dao =
new
PersonDao(getContext());
List<Person> persons =dao.findAll();
for
(Person p: persons){
System.out.print(p.toString());
}
}
}
|
同时API还提供了很多内置的方法,例如insert,delete等。也可以直接用,总之Android下使用SQLite还是非常方便的。
搬运自本人博客,xge技术博客:
http://www.xgezhang.com/android_sqlite.html
欢迎转载,请注明出处。