您的位置:首页 > 移动开发 > Android开发

Android中数据的存储方式(二)—SQLite数据库

2015-10-17 11:32 423 查看
程序中很重要的一部分是数据的交换,而交换中很重要一点是如何实现数据的存储。根据数据的作用,选择不同的保存方式和使用权限。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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 android sqlite