sqlite 是一个非常流行的嵌入式数据库,它提供了一个清爽的 sql 接口,相当小的内存占用和高速的响应,更 happy 的是他还是免费的,大家都可以尽情的使用,很多牛叉的公司(诸如 adobe,apple,google,sun,symbian ),开源项目( mozilla,php,python )都在产品中装配 sqlite.
android 中, sqlite 是被集成于 android runtime ,每个 android 应用程序都可以欢快的使用 sqlite 数据库,如果你熟悉 jdbc ,那么这个过程就更安逸了。
和传统关系数据库比较
有的:
sql 语句: select insert update
create drop
数据类型:
不区分大小写
text 文本
numeric 数值
integer 整型
real 小数
none 无类型
没有的:
foreign key 外键约束
right outer join 和 full outer join
alter table
动手之前,确认你的机器中已经配置好如下环境:
android 开发环境(怎么配置问 google ,有很多)
本文档适用环境 android1.0
1, 建库
方式一:命令行方式(适合调试用)
可以使用 adb shell 进入设备后台,命令行方式手动创建,步骤如下:
eclipse 中启动模拟器之后, cmd 下输入进入设备 linux 控制台
d:/>adb shell
之后进入应用 data 目录
# cd /data/data
ls 列表目录,查看文件,找到你的项目目录并进入
查看有无 databases 目录,如果没有,则创建一个
# mkdir databases
cd databases 进入并创建数据库
# sqlite3 friends.db
sqlite3 friends.db
sqlite version 3.5.9
enter ".help" for instructions
sqlite>
ctrl+d 退出 sqlite 提示符 ls 列表目录会看到有一个文件被创建 friends.db
他就是 sqlite 的库文件
# ls
ls
friends.db
方式二:编码方式(使用更多)
android.content.context 中提供了函数 , 注: activity 是 context 的子类
openorcreatedatabase () 来创建我们的数据库
db = context .openorcreatedatabase(
string database_name , int context. mode_private , null );
string database_name 数据库的名字
int mode 操作模式 context.mode_private 等
cursorfactory 指针工厂 ,本例中传入 null ,暂不用
2, 建表
命令行方式
# sqlite3
sqlite> create table widgets (id integer primary key autoincrement,name text);
3, 插入数据
命令行 增加,查询数据
sqlite> insert into widgets values(null,'tom');
insert into widgets values(null,'tom');
sqlite> select * from widgets;
select * from widgets;
1|tom
sqlite>
api 方式
调用
package com.demo.android.dummynote.tools;
import android.r;
import android.app.activity;
import android.database.cursor;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.edittext;
import android.widget.textview;
/**
* sqlite demo
*
* 供activity私有访问的数据库 没有使用contentprovider 方式 增加 查询数据
* @author [email protected]
*/
public class dbdemo extends activity {
edittext inputtxt;
button btnadd;
button btnviewall;
textview viewall;
dbhelper db;
@override
protected void oncreate(bundle savedinstancestate) {
// todo auto-generated method stub
super.oncreate(savedinstancestate);
this.setcontentview(r.layout.dbdemo);
// 初始化ui
btnadd = (button) findviewbyid(r.id.btnadd);
btnviewall = (button) findviewbyid(r.id.btnviewall);
viewall = (textview) findviewbyid(r.id.viewall);
inputtxt = (edittext) findviewbyid(r.id.txtinput);
// 初始化db
db = new dbhelper(this);
// 初始化监听
onclicklistener listener = new onclicklistener() {
public void onclick(view v) {
if (v.getid() == r.id.btnadd) {
// 增加
db.save(inputtxt.gettext().tostring());
db.close();
} else if (v.getid() == r.id.btnviewall) {
// 浏览所有数据
cursor cur = db.loadall();
stringbuffer sf = new stringbuffer();
cur.movetofirst();
while (!cur.isafterlast()) {
sf.append(cur.getint(0)).append(" : ").append(
cur.getstring(1)).append("/n");
cur.movetonext();
}
viewall.settext(sf.tostring());
};
btnadd.setonclicklistener(listener);
btnviewall.setonclicklistener(listener);
import android.content.context;
import android.database.sqlite.sqlitedatabase;
import android.util.log;
* 数据库操作工具类
public class dbhelper {
private static final string tag = "dbdemo_dbhelper";// 调试标签
private static final string database_name = "dbdemo.db";// 数据库名
sqlitedatabase db;
context context;// 应用环境上下文 activity 是其子类
dbhelper(context _context) {
context = _context;
// 开启数据库
db = context.openorcreatedatabase(database_name, context.mode_private,
null);
createtable();
log.v(tag, "db path=" + db.getpath());
* 建表 列名 区分大小写? 都有什么数据类型?<br>
* sqlite 3 text 文本 numeric 数值 integer 整型 real 小数 none 无类型 查询可否发送select ?
public void createtable() {
try {
db.execsql("create table t_user ("
+ "_id integer primary key autoincrement," + "name text"
+ ");");
log.v(tag, "create table t_user ok");
} catch (exception e) {
log.v(tag, "create table t_user err,table exists.");
* 增加数据
* @param id
* @param uname
* @return
public boolean save(string uname) {
string sql = "";
sql = "insert into t_user values(null,'" + uname + "')";
db.execsql(sql);
log.v(tag, "insert table t_user ok");
return true;
log.v(tag, "insert table t_user err ,sql: " + sql);
return false;
* 查询所有记录
* @return cursor 指向结果记录的指针,类似于jdbc 的 resultset
public cursor loadall() {
cursor cur = db.query("t_user", new string[] { "_id", "name" }, null,
null, null, null, null);
return cur;
public void close() {