程序中很重要的一部分是数据的交换,而交换中很重要一点是如何实现数据的存储。根据数据的作用,选择不同的保存方式和使用权限。Android数据的存储有如下6种:
- 保存数据到应用 程序私有的文件夹下
- 保存到公共的sd卡上
- sharedpreferences保存
- 使用xml文件去保存
- 使用数据库保存
- 内容提供者(Content provider)
一、概述
sqlite较其它android数据保存方式,sqlite能保存大量的结构相同的数据
支持标准的SQL语法
创建表
create table person( _id integer primary key autoincrement, name varchar(20), age integer);
增加一条记录
insert into person(name) values(‘tom‘, 25);
删除一条记录
delete from person where name = 'tom';
修改一条记录
update person set name = 'lisi' where name = 'tom';
查询数据
select * from person;
- 修改表结构
alter table person add balance integer;
google提供的api(CRUD)
google提供的CRUD的API很重要的一个特点是:每一个操作都有返回值(返回对应的行号),就此可以判断数据操作是否成功。注意,每次使用了数据库后都要close()。增加一条记录
SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "zhangsan"); values.put("age", 4); long rowid = db.insert(“person”, null, values);
删除一条记录
SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete("person", "personid<?", new String[]{"2"}); db.close();
修改一条记录
SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); //key为字段名,value为值 values.put(“name”, “zhangsan”); //下面把id为1的人删除掉 db.update("person", values, "personid=?", new String[]{"1"}); db.close();
查询数据
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。SQLiteDatabase db = databaseHelper.getWritableDatabase(); //下面的参数依次是:表、选择的行、条件、条件替代符内容、groupBy、having、排序方式、limit Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%zhang%"}, null, null, "personid desc", "1,2"); while (cursor.moveToNext()) { int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始 String name = cursor.getString(1);//获取第二列的值 int age = cursor.getInt(2);//获取第三列的值 } cursor.close(); db.close();
二、使用步骤
sqlite是内置的,通过继承SQLiteOpenHelper,就可以操作数据库,必须重写两个函数onCreate和onUpgrade
onCreate只在创建时调用一次,而之后每一次的版本更新,都调用onUpgrade方法
数据库的使用步骤是:
1.新建工程后,创建一个类继承SQLiteOpenHelper类,并重写一个构造函数和两个方法
2.在DAO层中创建SQLiteOpenHelper类,并调用sqlite.getWritableDatabase()方法,获取SQLiteDatabase
3.当版本需要变更时,需要修改程序中的构造方法,调整版本参数(最后一位参数)
public MySqliteOpenHelper(Context context) {
super(context, "sky.db", null,1);
}
4.为sqlite加入增删改查方法
5.关闭SQLiteDatabase
6.进行Test测试
三、版本问题
版本跳跃问题
由版本1跳到版本3的处理方法,根据 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法参数的oldVersion和newVersion,写switch语句让不同的版本可以操作跳跃版本情况
四、数据库事务
数据库事务,一个事务的流程是:1.明确事务,2.开始这个事务,3.结束事务。事务如果只开始不结束,就回滚(即不执行事务中对数据的操作)。
//开始事务
db.beginTransaction();
try {
Update account set money=money-100 where name=’aaa’;
Update account set money=money+100 where name=’bbb’;
db.execSQL("update account set money=money-100 where name='aaa'");
int i = 1/0;
db.execSQL("update account set money=money+100 where name='bbb'");
db.setTransactionSuccessful();
} finally {
//只有下面的方法执行,事务才会完成,否则回滚
db.endTransaction();
}