一、SQLite数据库的简介
SQLite是一个轻量级数据库,第一个版本诞生于2000年5月。它最初是为嵌入式设计的,占用资源非常少,在内存中只需要占用几百kb的存储空间。这是Android移动设备采用SQLite数据库的原因之一。
SQLite是遵循ACID关联式的数据库管理系统。这里的ACID指的是数据库事务正确执行的4个基本要素,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。同时SQLite还支持SQL语言、事务处理等功能。
SQLite由于没有服务器进程,它是通过文件保存数据,该文件是跨平台的,可以放在其他平台中使用。保存数据,支持NULL,INTEGER,REAL(浮点数字),TEXT(字符串文本)和BLOB(二进制对象)5种数据类型。但实际上SQLite也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时回转换成对应的5种数据类型。因此,可以将各种类型的数据保存在任何字段中,而不用关心字段声明的数据类型。这也是SQLite数据库的最大特点。
二、SQLite数据库的使用
1.SQLiteOpenHelper类
SQLiteOpenHelper是一个抽象类,该类用于创建数据库和数据库版本更新。
SQLiteOpenHelper常用方法
方法名称 | 功能描述 |
---|---|
pubic SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version) | 构造方法,一般需要传递一个创建的数据库名称即name参数,版本号version最小为1 |
public void onCreate(SQLiteDatabase db) | 创建数据库时调用的方法 |
public void onUpgrade(SQLiteDatabase db,int oidVersion,int newVersion) | 数据库版本更新时使用 |
public SQLiteDatabase getReadableDatabase() | 创建或打开一个只读的数据库 |
public SQLiteDatabase getWritableDatabase() | 创建或打开一个读写的数据库 |
2.SQLiteDatabase类
SQLiteDatabase是一个数据库访问类,该类封装了一系列数据库操作的API,可以对数据进行增、删、改、查等操作。
SQLiteDatBase常用方法
方法名称 | 功能描述 |
public long insert(String table,String nullColumnHack,ContentValues values) | 添加一条数据,其中的参数分别表名、列名、参数集合 |
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询数据,参数 columns代表列名数据,selection代表查询条件,selectionArgs代表查询参数值,groupBy代表分组,having代表聚合函数,orderBy代表排序 |
public Cursor rawQuery(String sql,String[] seletionArgs) | 执行带占位符的SQL查询 |
public int updata(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改特定数据 |
public int delete(String table,ContentValues values,String whereClause,String[] whereArgs) | 删除表中特定记录 |
public void execSQL(String sql,Object[] bingArgs) | 执行一条带占位符的SQL语句 |
public void close() | 关闭数据库 |
3.Cursor接口
Cursor是一个有游标接口,在数据库操作中作为返回值,相当于结果集ResultSet。
Cursor常用方法
方法名称 | 功能描述 |
---|---|
boolean moveToNext() | 移动光标到下一行 |
int getInt(int columnIndex) | 获取指定列的整型值 |
int getColumnIndex(String columnName) | 返回指定列索引值,如果列不存在则返回-1 |
String getString(int coulumIndex) | 获取指定列的字符串 |
boolean moveToFirst() | 移动光标到第一行 |
boolean moveToLast() | 移动光标到最后一行 |
boolean moveToPrevious() | 移动光标到上一行 |
boolean moveToPosition(int position) | 移动光标到指定位置 |
int getCount() | 返回Cursor中的行数 |
int getPositioin() | 返回当前Cursor的位置 |
String getColumnName(int columnIndex) | 根据列的索引值获取列的名称 |
String[] getColumnName() | 获取Cursor所有列的名称和数组 |
三、数据库的常用操作
1.创建SQLite数据库
Andriod系统推荐使用SQLiteOpenHelper的子类创建SQLite数据库,因此需要先创建一个类继承SQLiteOpenHelper,重写onCreate()方法,并在该方法中执行创建数据库的命令
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
public PersonSQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, "person.db", null, 5);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person ( //初始化数据库表结构,执行一个建表SQL语句
id integer primary key autoincrement, "+
"name varchar(20), "+
"number varchar(20)) ");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table person add account varchar(20)");
}
}
注意,创建的数据库被放置在/data/data/<your package name>/database目录下
2.增加一条数据
以person表为例,查person表中添加数据,先要得到一个可读写的SQLiteDatabase对象
public long add(String name,String number){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues(); //将参数名和列添加到ContentValues对象里面
values.put("name", name);
values.put("number", number);
long id = db.insert("person", null, values);
db.close();
return id;
}
3.修改一条数据
public int update(String name, String newnumber){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", newnumber); //将参数以key,values的形式添加进去
int number = db.update("person", values, "name=?", new String[]{name});
db.close();
return number;
}
4.删除一条数据
public int delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
int number = db.delete("person", "name=?", new String[]{name});
db.close();
return number;
}
5.查询一条数据
查询有两种方式,第一个种是通过query()方法
public boolean find(String name){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("person", null, "name=?",
new String[]{name}, null, null, null);
boolean result = cursor.moveToNext();//是否有下一条值
cursor.close();
db.close();
return result;
}
第二种是通过SQL语句查询
Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
查询与增删改不同的是,前面3个操作,都可以用execSQL()方法执行SQL语句,而这里使用rawQuery,因为查询数据库会返回一个结果集Cursor。
在使用完SQLiteDatabase和Cursor对象一定要及时关闭,否则会造成内存泄露
四、SQLite事务操作
现实生活中,我们经常进行的转账操作,转账操作分为两部分来完成,转入和转出,只有这两部分都完成才认为转账成功。如果转账的时候只有转入成功,会反生两个账户金额不同步。SQLite数据库为了避免,引入了事务。
要通过使用SQLite的事务来模拟银行转账功能。首先,要得到一个可写的SQLiteDatabase对象,然后开启事务执行转入和转出操作,最后关闭事务。
PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();
try {
db.execSQL("update person set account=account-1000 where name =?",
new Object[] { "zhangsan" });
db.execSQL("update person set account=account+1000 where name =?",
new Object[] { "wangwu" });
db.setTransactionSuccessful();
}catch (Exception e) {
Log.i("事务处理失败", e.toString());
} finally {
db.endTransaction();
db.close();
}
}
注意,事务操作完成后,
一定要使用endTransaction()方法关闭事务,当执行到endTransaction()方法时首先会检查是否有事务执行成功的标记,有则提交数据,无则回滚数据。最后关闭事务,如果不关闭,事务超时才会结束,会降低数据库并发效率。通常放在finally中执行。