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); } } } } }