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()方法便可以创建一张表了。
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.getCount();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<c.getCount();i++)
{
c.move(i);
int id = c.getInt(0);
String name = c.getString(1);
System.out.println(id+":"+name);
}
}
}
}
}
