创建数据库
新建类,继承android.database.sqlite.SQLiteOpenHelper
实现里面的方法
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
//数据库创建时此方法会调用
@Override
public void onCreate(SQLiteDatabase db) {
}
//数据库升级时此方法会调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
1,构造方法
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
context:上下文,用的时候把activity传进来就行
name:数据库文件的名字
factory:游标工厂,创建游标对象,一般传null,使用默认的
version:数据库的版本号,方便升级用,int数据,必须从1开始,只要设置一个较大的值就会升级
2,用单元测试框架测试创建数据库代码是否正常执行
public class TestCase extends AndroidTestCase {
public void test(){
//getContext():获取虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 3);
//如果数据库不存在,先创建数据库,再获取可读可写数据库,如果数据库存在,就直接打开
SQLiteDatabase db = oh.getWritableDatabase();
//先创建数据库再打开数据库,当手机存储空间满了,就返回只读数据库,现在不用,一般很难满
//SQLiteDatabase db = oh.getReadableDatabase();
}
}
注:测试框架中没有上下文,getContext()获取虚拟上下文
数据库的增删改查
- SQL语句:
- insert into person (name, phone, money) values (‘张三’, ‘138777777’, 1000);
- delete from person where name = ‘李四’ and _id = 4;
- update person set money = 6000 where name = ‘李四’;
- select name, phone from person where name = ‘张三’;
创建表
一般放在创建数据库的onCreat方法里面,在创建库的同时表也就创建了出来,如果是对数据库进行升级,添加表的方法就放在upgrate方法里面
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person(_id integer primary key autoincrement, name char(10), salary char(20), phone integer(20))");
}
往表里插入数据
public void insert(){
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 3);
SQLiteDatabase db = oh.getWritableDatabase();
db.execSQL("insert into person (name, salary, phone )values(?, ?, ?)",new Object[]{"Tom","13000", 1384777777});
//规范,数据库执行完毕要关掉
db.close();
}
注意:
1,执行测试的时候要把方法名选中再执行,否则得不到想要的结果
2,SQLite不检测数据类型,因为SQLite是轻量级数据库,占用资源少,牺牲了一部分功能,没有其它数据库那么严谨,数据库里全部都是字符串
3,虽然不检查,但也不保存错误的数据类型
删除数据
db.execSQL("delete from person where name = ?",new Object[]{"Lee"});
修改数据库
public void update(){
db.execSQL("update person set phone = ? where name = ?", new Object[]{"15877788889", "Mary"});
}
查询数据库
public void select(){
Cursor cursor = db.rawQuery("select name, salary from person", null);
while(cursor.moveToNext()){ //移到下一行
//取下一行的数据
String name = cursor.getString(cursor.getColumnIndex("name")); //通过列名获取列索引
String salary = cursor.getString(cursor.getColumnIndex("salary"));
System.out.println(name + ":" + salary);
}
}
通过API来实现增删改查
插入
public void insertApi(){
//把要插入的数据全部封装到ContentValues中
ContentValues values = new ContentValues();
values.put("name", "Amy");
values.put("phone", "15978787878");
values.put("salary", "17000");
//表名;字段控制,一般传null;封装插入的数据,键值对
db.insert("person", null, values);
}
删除
public void deleteApi(){
int i = db.delete("person", "name = ? and _id = ?", new String[]{"Lily", "6"}); //返回值是行数
System.out.println(i);
}
修改
public void updateApi(){
ContentValues values = new ContentValues();
values.put("salary", 26000);
db.update("person", values, "name = ?", new String[]{"Lily"});
}
查询
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
public void selectApi(){
//表名;列名,String[]{},所有字段是null;查询的where条件;占位符;分组;排序;分页查询
db.query("person", null, null, null, null , null, null, null);
}
事务
保证所有sql语句要么一起成功,要么一起失败
public void transation(){
try{
//开启事务
db.beginTransaction();
ContentValues values = new ContentValues();
values.put("salary", 13000);
db.update("person", values, "name = ?", new String[]{"Lily"});
//清空掉之前的数据,不清空容易把第一次的数据带过来
values.clear();
values.put("salary", 15000);
db.update("person", values, "name = ?", new String[]{"Mary"});
//设置事务执行成功
db.setTransactionSuccessful();
}
finally{
//关闭同时提交事务,如果已经设置事务执行成功,那么sql语句就会生效,否则就会回滚
db.endTransaction();
}
}