Android中通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。
SQLite数据库不想其他的数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到广泛应用。Android也没有重复发明“轮子”,而是直接是用了SQLite数据库。
一、SQLiteDatabase
Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面我们先看看SQLiteDatabase的常用方法。
SQLiteDatabase的常用方法
方法名称 |
方法描述 |
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) |
打开或创建数据库 |
insert(String table,String nullColumnHack,ContentValues values) |
添加一条记录 |
delete(String table,String whereClause,String[] whereArgs) |
删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) |
查询一条记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) |
修改记录 |
execSQL(String sql) |
执行一条SQL语句 |
close() |
关闭数据库 |
1、打开或者创建数据库
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库,该方法的第一个参数是数据库的创建路径,注意这个路径一定是数据库的全路径。例如/data/data/package/databases/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
下面的代码创建了一个temp.db数据库
SQLiteDatabase.openOrCreateDatabase("/data/data/com.hualang.test/databases/temp.db",null);
2、创建表
创建一张表很简单。首先,编写创建表的SQL语句,然后,调用SQLiteDatabase的execSQL()方法便可以创建一张表了。
下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、username(用户名称)、password(密码)
private void createTable(SQLiteDatabase db)
{
//创建表SQL语句
String sql="create table usertable(id integer primary key autoincrement,username text,password text)";
//执行SQL语句
db.execSQL(sql);
}
3、插入数据
插入数据有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数是空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;令一种方法是编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
下面的代码演示了如何插入一条记录到数据库。
方法1:
//插入数据
private void insert(SQLiteDatabase db)
{
//插入数据SQL语句
String sql="insert into usertable(username,password) values('hualang','123456')";
//执行SQL语句
db.execSQL(sql);
}
方法2:
private void insert(SQLiteDatabase db)
{
//实例化常量值
ContentValues cv = new ContentValues();
//添加用户名
cv.put("username","hualang");
//添加密码
cv.put("password","123456");
//插入
db.insert("usertable",null,cv);
}
4、删除数据
和插入数据类似,删除数据也有两种方法:一种是调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数是删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
下面代码演示了如何删除记录
方法1:
//删除
private void delete(SQLiteDatabase db)
{
//删除SQL语句
String sql = "delete from usertable where id = 6";
//执行SQL语句
db.execSQL(sql);
}
方法2:
private void delete(SQLiteDatabase db)
{
//删除条件
String whereClause = "id=?";
//删除条件参数
String[] whereArgs = {String.valueOf(5)};
//执行删除
db.delete("usertable",whereClause,whereArgs);
}
5、查询数据
查询数据相对比较傲复杂,因为查询可能会带来很多条件。不过熟悉SQL查询的读者都知道这只不过是把查询SQL封装成方法而已。下面看一个查询方法。
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
①table:表名称
②columns:列名称数组
③selection:条件字句,相当于where
④selectionArgs:条件字句,参数数组
⑤groupBy:分组列
⑥having:分组条件
⑦orderBy:排序列
⑧limit:分页查询限制
⑨Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法
方法名称 |
方法描述 |
getCount() |
总记录条数 |
isFirst() |
判断是否第一条记录 |
isLast() |
判断是否最后一条记录 |
moveToFirst() |
移动到第一条记录 |
moveToLast() |
移动到最后一条记录 |
move(int offset) |
移动到指定记录 |
moveToNext() |
移动到下一条记录 |
moveToPrevious() |
移动到上一条记录 |
getColumnIndexOrThrow(String columnName) |
根据列名称获得列索引 |
getInt(int columnIndex) |
获得指定列索引的int类型值 |
getString(int columnIndex) |
获得指定列缩影的String类型值 |
下面的代码演示了如何查询数据类型
private void query(SQLiteDatabase db)
{
//查询获得游标
Cursor c = db.query("usertable",null,null,null,null,null,null);
//判断游标是否为空
if(c.moveToFirst())
{
//遍历游标
for(int i=0;i { c.move(i); //获得ID int id = c.getInt(0); //获得用户名 String username=c.getString(1); //获得密码 String password=c.getString(2); //输出用户信息 System.out.println(id+":"+username+":"+password); } } } 6、修改数据 和添加删除相同,修改数据有两种方式,一是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更行列ContentValues类型的键值对(Map),第三个参数是更新条件(where字句),第四个参数是更新条件数组。而是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。 下面的代码演示了如何更新数据 private void update(SQLiteDatabase db) { //修改SQL语句 String sql = "update usertable set password = 654321 where id = 1"; //执行SQL db.execSQL(sql); } 方法2: private void update(SQLiteDatabase db) { //实例化内容值 ContentValues values = new ContentValues(); //在values中添加内容 values.put("password","123321"); //修改条件 String whereClause = "id=?"; //修改添加参数 String[] whereArgs={String.valuesOf(1)}; //修改 db.update("usertable",values,whereClause,whereArgs); } 二、SQLiteOpenHelper SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新,一般的用法是定义一个类继承之,并实现其抽象方法onCreate(SQLiteDatabase db)和opUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)来创建和更新数据库。 SQLiteOpenHelper常用方法 方法名称 方法描述 SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 构造方法,一般是传递一个要创建的数据库名称name参数 onCreate(SQLiteDatabase db) 创建数据库时调用 onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 版本更新时调用 getReadableDatabase() 创建或打开一个只读数据库 getWritableDatabase() 创建或打开一个读写数据库 例如下面的代码演示
public class MainActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//实例化数据库帮助类
MyDbHelper helper = new MyDbHelper(this);
//插入
helper.insert();
//查询
helper.query();
}
//数据库帮助类
class MyDbHelper extends SQLiteOpenHelper
{
//创建表SQL语句
private static final String CREATE_TABLE_SQL =
"create table usertable(id intger,name text)";
//SQLiteDatabase实例
private SQLiteDatabase db;
//构造方法
MyDbHelper(Context c)
{
super(c,"test.db",null,2);
}
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_TABLE_SQL);
}
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
{
}
//插入方法
private void insert()
{
//插入SQL语句
String sql="insert into usertable(id,name) values(1,'hualang')";
//执行插入
getWriteableDatabase().execSQL(sql);
}
//查询方法
private void query()
{
//查询获得游标
Cursor c = getWritableDatabase().query("usertable",null,null,null,null,null,null);
//判断游标是否为空
if(c.moveToFirst())
{
//遍历游标
for(int i=0;i