一,sqlite介绍
1,sqlite:轻量级数据库->不区分数据类型 嵌入式数据库->不需要安装相应的软件支持 直接调用系统提供的API就可以使用了
2,创建数据库实际上就是一个特殊的一个文件 这个文件在包下面
二,SQLite的简单使用:
1,创建一个类继承SQLiteOpenHelper,实现构造方法,onCreate 和 onUpgrade
//继承这个需要添加一个构造方法 还需要添加未实现的方法
public class MyHelPer extends SQLiteOpenHelper {
// 因为父类 没有无参的构造方法
public MyHelPer(Context context) {
// 参数2:数据库名字
// 参数4:数据库版本号 这个版本号 只能升 不能降
// 把参数写死删除多余的参数。
super(context, "heima.db", null, 1);
}
// 第一次创建数据库的时候会调用 只会调用一次 它会用来初始化表结构
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("onCreate");
//表结构初始化。如果你想要id自动增长 那么就需要把id 设为 Integer primary key
db.execSQL("create table student(id Integer primary key,name text,age text)");
}
// 数据库升级的时候 会调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onUpgrade");
db.execSQL("alter table student add nick text");
}
}
2,对数据库里的数据进行增删改查
public class SqliteTest extends AndroidTestCase {
public void add() {
//获取SQLite对象创建对象
MyHelPer helPer = new MyHelPer(getContext());
// helPer.getReadableDatabase(); // 可读 如果存储空间满 不会报错 会给你返回一个可读的数据库
// helPer.getWritableDatabase();// 可写 如果存储空间满 会报错
SQLiteDatabase db = helPer.getReadableDatabase();
for (int i = 0; i < 10; i++) {
//执行SQL语句
db.execSQL("insert into student values(null,'张三',18" + i + ")");
}
}
public void remove() {
MyHelPer helPer = new MyHelPer(getContext());
SQLiteDatabase db = helPer.getReadableDatabase();
db.execSQL("delete from student where id = 1");
}
public void update() {
MyHelPer helPer = new MyHelPer(getContext());
SQLiteDatabase db = helPer.getReadableDatabase();
db.execSQL("update student set name = '李四'");
}
public void query() {
MyHelPer helPer = new MyHelPer(getContext());
SQLiteDatabase db = helPer.getReadableDatabase();
// rawQuery获取当前光标
Cursor cursor = db.rawQuery("select * from student ", null);
// cursor.moveToFirst(); 移动至第一
// cursor.moveToLast(); 移动至末尾
//光标移动到下一个
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String age = cursor.getString(cursor.getColumnIndex("age"));
String nick = cursor.getString(cursor.getColumnIndex("nick"));
System.out.println("id = "+id +" name = "+name + " age = "+age +" nick = "+nick);
}
}
}
三,Google 自己封装好的API进行调用。
public class GooGleAPITest extends AndroidTestCase {
private SQLiteDatabase db;
// 单元测试之前会执行
@Override
protected void setUp() throws Exception {
super.setUp();
MyHelPer helPer = new MyHelPer(getContext());
db = helPer.getReadableDatabase();
}
public void add() {
ContentValues values = new ContentValues();
values.put("name", "李四");
values.put("age", 20);
// 参数1:表名
// 参数2: 如果没有写对表格中对应的字段 那么这个值 就会没有对应的字段的值
// 参数3:一个ContentValues里面封装了与表中对应的字段的数据
long result = db.insert("student", "", values);
if (result != -1) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
}
public void remove() {
// 参数1:表名
// 参数2: 删除条件
// 参数3: 删除条件的值
int result = db.delete("student", "id=?", new String[] { "11" });
if (result > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
public void update() {
// 参数1:表名
// 参数2:ContentValues
// 参数3:更新的条件
// 参数4:更新条件的值
ContentValues values = new ContentValues();
values.put("name", "李四");
int result = db
.update("student", values, "id=?", new String[] { "10" });
if (result > 0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
}
public void query() {
// 参数1:表名
// 参数2:列名
// 参数3:查询条件
// 参数4:查询条件的值
// 参数5:分组查询
// 参数6:分组查询的条件
// 参数7:排序
// 参数8:分页查询
Cursor cursor = db.query("student", null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String age = cursor.getString(cursor.getColumnIndex("age"));
System.out.println("id = "+id +" name = "+name +" age = "+age);
}
}
}
四,Android 事务
1,事务:要么代码执行都成功,要么代码执行都失败
2,事务的标准写法:
事务的标准写法:
db.beginTransaction();
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
3,事务的用法:
public class BankTest extends AndroidTestCase {
private SQLiteDatabase db;
@Override
protected void setUp() throws Exception {
super.setUp();
MyHelper helper = new MyHelper(getContext());
db = helper.getReadableDatabase();
}
public void bankTest() {
// 事务: 一组sql语句 要么都执行成功 要么都执行失败 回滚
db.beginTransaction(); // 标记事务开始
try {
//使用增删改查
db.execSQL("update bank set money=money-4000 where id =1");
db.execSQL("update bank set money=money+4000 where id=2");
db.setTransactionSuccessful(); // 标记事务执行成功
} finally {
db.endTransaction();// 标记事务结束
}
}
}