在我们平时做Android项目,不管是应用还是游戏,都会用到SQLite数据库,在这里我还是简单的整理了一下。
1.简介
SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。
一般的数据库采用的是固定的静态数据类型,SQLite采用动态数据类型,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,比如可以把一个字符串(String)放入 INTEGER 列。SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。
在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。
此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
2.Android 集成了 SQLite 数据库
Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。
数据库存储在 data/data/<项目文件夹>/databases/ 下。
A.数据类型
1.NULL 空值
2.INTEGER 带符号的整型
3.REAL 浮点型
4.TEXT 字符串文本
5.BLOB 二进制对象
但实际上,sqlite3也接受如下的数据类型:
smallint 16 位元的整数。
interger 32 位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!
B.简单使用
Android平台下数据库相关类:
SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。
SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作。
SQLiteCursor 查询结构操作类:用来访问查询结果中的记录。
Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
C.创建数据库
Android不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。
SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。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
38
39
40
41
42
43
44
45
46
|
package
com.dandan.fm.db;
import
android.content.Context;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteDatabase.CursorFactory;
import
android.database.sqlite.SQLiteOpenHelper;
public
class
DBHelper
extends
SQLiteOpenHelper {
public
DBHelper(Context context,
String
name, CursorFactory factory,
int
version) {
super
(context, name, factory, version);
}
@Override
public
void
onCreate(SQLiteDatabase db) {
db.execSQL(
"create table user(id INTEGER PRIMARY KEY AUTOINCREMENT,"
+
"name varchar(20), address TEXT)"
);
}
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
}
@Override
public
void
onOpen(SQLiteDatabase db) {
super
.onOpen(db);
}
@Override
public
synchronized
void
close() {
super
.close();
}
}
|
说明:
创建表和索引
|
1
2
|
db.execSQL(
"create table user(id INTEGER PRIMARY KEY AUTOINCREMENT,"
+
"name varchar(20), address TEXT)"
);
|
给表添加数据
有两种方式添加数据:
1.向上面创建表一样,可以使用execSQL方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。execSQL适用于 所有不需要返回结果的SQL语句。如:
|
1
2
|
db.execSQL(
"INSERT INTO user (name, address) VALUES ('woniu',"
+
"'http://http://smallwoniu.blog.51cto.com/')"
);
|
2.SQLiteDatabase 对象的 insert(), update(), delete() 方法。这些方法把 SQL 语句的一部分作为参数。如:
|
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
|
private
SQLiteDatabase mDataBase =
null
;
private
static
final
String
USER_TABLE =
"user"
;
public
void
getDB() {
DBHelper db =
new
DBHelper(
this
, USER_TABLE,
null
,
1
);
mDataBase = db.getWritableDatabase();
}
public
void
insert() {
ContentValues cv =
new
ContentValues();
cv.put(
"name"
,
"LiuMing"
);
cv.put(
"address"
,
"ShangHai"
);
mDataBase.insert(USER_TABLE,
null
, cv);
}
public
int
update() {
ContentValues cv =
new
ContentValues();
cv.put(
"name"
,
"MaLi"
);
return
mDataBase.update(USER_TABLE, cv,
"id = ?"
,
new
String
[]{
"1"
});
}
public
int
delete
() {
return
mDataBase.
delete
(USER_TABLE,
"id = ? and name = ?"
,
new
String
[]{
"1"
,
"MaLi"
});
}
|
查询数据库
与INSERT,UPDATE,DELETE类似,有两种方法从数据库中查询数据。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
Cursor rawQuery() {
return
mDataBase.rawQuery(
"select * from user where id = ? and name = ?"
,
new
String
[]{
"1"
,
"LiuMing"
});
}
public
Cursor query() {
String
[] columns = {
"name"
,
"address"
};
return
mDataBase.query(USER_TABLE, columns,
"id = ?"
,
new
String
[] {
"1"
},
null
,
null
,
null
);
}
|
最后着重提及一下使用游标,不管如何执行查询,都会返回一个Cursor,Curosr主要方法如下:
| getCount(): |
获得结果集中有多少记录。 |
| moveToFirst(): |
移动到第一行。 |
| moveToNext(): |
移动到下一行,可遍历所有记录。 |
| isAfterLast(): |
判断是否最后一行。 |
| getColumnNames(): |
返回字段名。 |
| getColumnCount(): |
返回字段号。 |
| getString(),getInt(): |
得到给定字段当前记录的值。 |
| requery(): |
重新执行查询得到游标。 |
| close(): |
释放游标资源。 |
|
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
|
public
ArrayList<HashMap<
String
,
Object
>> getWriteAllCount() {
openDatabase();
ArrayList<HashMap<
String
,
Object
>> data =
null
;
Cursor cursor = db.query(DBInfo.Table.TB_WRITE_NAME,
null
,
null
,
null
,
null
,
null
,
null
);
if
(
null
!= cursor && cursor.getCount() >
0
) {
data =
new
ArrayList<HashMap<
String
,
Object
>>();
while
(cursor.moveToNext()) {
HashMap<
String
,
Object
> map =
new
HashMap<
String
,
Object
>();
map.put(
"title"
,cursor.getString(cursor.getColumnIndex(
"title"
)));
map.put(
"content"
,cursor.getString(cursor.getColumnIndex(
"content"
)));
map.put(
"imagePath"
,cursor.getString(cursor.getColumnIndex(
"imagePath"
)));
map.put(
"time"
, cursor.getString(cursor.getColumnIndex(
"time"
)));
map.put(
"color"
,cursor.getString(cursor.getColumnIndex(
"color"
)));
map.put(
"background"
,cursor.getInt(cursor.getColumnIndex(
"background"
)));
map.put(
"lock"
,cursor.getInt(cursor.getColumnIndex(
"lock"
)));
data.add(map);
}
}
cursor.close();
db.close();
return
data;
}
|
当然,如果我们遇到大量反复对数据库进行操作时,我们可以使用异步加载数据库(可以看我的下一篇博客),改善加的用户体验效果
本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1249999,如需转载请自行联系原作者