Android-数据库学习总结
目录
Android 数据库学习总结
android 数据库学习总结
- android 为了让我们能方便的使用数据库,给我们提供了一个SQLiteOpenHelper帮助类
- 它是一个抽象类,所以我们需要自定义一个类来继承这个类来实现我们创建数据库的逻辑
实现逻辑
创建以及更新
先说一下他的构造方法,我们一般重写第一个(有四个参数的)构造方法
- 四个参数分别的意思是(context,数据库名,null(这里也允许是一个自定义的Cursor,他会在查询到数据之后返回),当前数据库的版本号)
再说一下两个我们需要重写的方法
- onCreate(),创建数据库方法,内部调用,创建一个数据库
- onUpgrade(),升级数据库方法,也是内部调用
还有我们一般使用的两个方法(都是得到一个数据库实例)
- getReadableDatabase(),以读的方式得到一个数据库实例
- getWritableDatabase(),以写的方式打开一个数据库实例
- 注意 :当数据库不可写入的时候,前者是返回一个只能 写 的数据库,而后者是报异常
说一下创建的逻辑
- 当我们去new这个数据库的时候,其实只是拿到了这个数据库的操作句柄,关于具体这个数据库存不存在,这就不是这里干的事
- 然后我们去拿着这个实例再去得到读数据库的实例,当在这里的时候他就会判断,如果数据库不存在,就onCreate(),如果存在就去判断版本是不是当前版本,如果我们在new的时候传入的版本比之前已经存在的数据库版本高,那么就会调用onUpgrade()这个方法去更新数据库,所以更新数据库的逻辑需要我们自己去写
- 这里看一下建表语句
create table Book(
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
- 说明:integer代表整型,real代表浮点型,text代表文本型,blob代表二进制primary key 将id列设置为主键,并用autoincrement表示id列是自增的
- 这里看一下自定义的数据库的创建方法的代码
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer"
+ "name text)";
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Log.d("------","创建成功");
}
- 说到底就是将我们刚才说的数据库建表语句写成一个字符串传入execSQL()这个方法,就完成了数据库的建立
- activity中的代码
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();
- 第二句话调用之后数据库才被创建
数据库的升级
- 根据我们的前面的解释,数据库的升级方法需要我们自己实现,看一下这个方法的实现
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
- 里面是一句固定字符串,如果存在就删除,删除完毕在创建一次
- 注意这个升级方法,是在调用了getWritableDatabase()和getReadableDatabase()这个方法才会被调用的
- 现在我们在数据库已经存在的情况下,在new 的时候传入一个高版本的数字,数据库的升级工作将在我们调用那两个方法的时候完成
增删改查
- 为我们提供了四个方法,一一看吧
insert:插入(添加)
- 接收三个参数:
- 第一个:表名
- 第二个:用于在未指定添加数据的情况下给某些可为空的列自动赋值为NULL,一般用不到,直接传null
- 第三个:是一个ContentValues对象,这个对象用于将我们想添加的数据进行包装,他提供了一系列的put键值对的方法,让我们去设置我们想要传入的数据
- 看代码
SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","大笑江湖");
values.put("page",456);
values.put("price",20.12);
values.put("author","作者");
writableDatabase.insert("Book",null,values);
values.clear();
values.put("name","龙王传说");
values.put("page",5555555);
values.put("price",85);
values.put("author","我吃西红柿");
writableDatabase.insert("Book",null,values);
- 不解释,看下一个
updata:更新数据
- 四个参数
- 第一个:表名
- 第二个:ContentValues对象,把要跟新的数据包装
- 第三个和第四个,是用来约束更新某一行或者某几行的数据,不指定的话默认就是更改所有行
- 上代码
SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",122);
writableDatabase.update("Book",values,"name = ?",new String[]{"龙王传说"});
- 没疑问,稍稍一看就懂,下一个
delete:删除数据
- 三个参数
- 第一个:表名
- 第三个和第二个,是用来约束删除某一行或者某几行的数据,不指定的话默认就是删除所有行
- 上代码
SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();
writableDatabase.delete("Book","page > ?",new String[]{"200"});
query:查询
- 这个方法比较复杂,有好几个重载方法,而且方法的参数特别多,但其实都是对查询数据的约束,我们来看一下一些参数的意义
- table :指定查询的表名
- columns :指定查询的列名
- selection :指定where的约束条件
- selectionArgs :为上个参数的占位符提供具体的参数
- groupBy :指定需要groupBy的列
- having :对groupBy后的结果进一步约束
- orderBy:指定查询结果的排序方式
- 看一下代码吧
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
do{
Log.d("---Query---name---",""+cursor.getString(cursor.getColumnIndex("name")));
Log.d("---Query---author---",""+cursor.getString(cursor.getColumnIndex("author")));
Log.d("---Query---price---",cursor.getDouble(cursor.getColumnIndex("price"))+"");
Log.d("---Query---pages---",""+cursor.getInt(cursor.getColumnIndex("pages")));
Log.d("-----------", "onClick: -----------------------------");
}while (cursor.moveToNext());
}else {
Log.d("----------", "onClick: 数据库为空");
}
- 先让cursor的指针挪到最前头,然后从前到后遍历
总结
- 其实操作也就那样子,熟悉就好
- 主要对更新数据库那里不太理解,为什么更新的时候要把已经存在的数据库删除掉呢
- 还有,对数据库的增删改查主要是对表以及约束条件的书写,需要注意