在刚接触android的时候就知道有SQlite数据库了,只不过向来对数据库不太感冒,因此做安卓一段时间了都不太会使用Sqlite。于是使用各种sqlite的框架,用以替代。比如郭霖大神的Litepal。
不过使用第三方框架有时候也会出现各种问题,而且不懂sqlite的基本使用总感觉不太踏实啊。因此又一次重温了sqlite的知识。并写下来。
Android为了让我们更加方便地管理数据库,于是专门提供了一个叫做SQLiteIpenHelper的帮助类。毕竟也不是每个人都精通数据库,相信也有不少开发者跟笔者一样不太会使用数据库,sql语句的。那么这个帮助类正好可以帮助那些不懂sql语句的人去操作数据库
使用SQLiteOpenHelper操作数据库
创建数据库:
使用SQliteIpenHelper创建数据表还是需要用到一点SQL语句的,如果对创建表的SQL语句不熟悉可以参考文章:
MySql:操作表的语句以及常用的字段类型
首先要知道SQLiteOpenHelper是一个抽象类。意味着我们要是用他的话必需要创建自己的一个类去继承它。
接下来呢就创建一个DataBaseHelper的类继承SQLiteOpenHelper可以发现SQLiteOpenHelper有几个抽象方法需要我们去实现的,而且必需要有一个构造方法。
public class DataBaseHelper extends SQLiteOpenHelper {
public DataBaseHelper(Context context, String name, SQLiteDatabase.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) {
}
}
我们需要在自己的帮助类里面重写这两个方法,看方法名可以猜到onCreate实在数据库创建的时候会调用,而onUpgrade在升级数据库的时候会调用。
public class DataBaseHelper extends SQLiteOpenHelper {
public DataBaseHelper(Context context, String name, SQLiteDatabase.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) {
}
}
那么这里先创建数据库,创建数据库很简单,直接new一个帮助类的对象出来,并在帮组类的构造方法传进相关参数就可以创建数据库了。
public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
上面就是帮助类的构造方法,第一个参数Context就不用说了,必须要有context才能对数据库进行操作。第二个参数是数据库名称,第三个参数允许我们在查询数据的时候返回一个自定义Cursor,这个参数一般为null。第四个表示当前数据库的版本号。
因此在activity中创建一个叫做TestDB的数据库并创建一张用户表:User表,表中有id(主键),用户名,密码三列。
首先要创建一个帮助类的实例:
DataBaseHelper helper= new DataBaseHelper(this, "TestDB",null,1);
版本号这里我们先传入1;
要创建一张User表,也需要一点SQL语句的功力,创建User表的语句如下所示:
final static String CREATE_NEW_TABLE = "create table user(id integer primary key autoincrement," +
"username text," +
"password text" +
")";
上面的就是用java字符串拼凑成的建表语句,稍微对sql语句熟悉的人都可以看到创建一张user表,表中有三列,其中id为整形的主键,主键自增长。然后还有两列是文本烈性的用户名与密码。
那么怎么去执行这段sql语句呢?
刚才创建数据库的时候,我们把这句sql语句放在onCreate里面执行:
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_NEW_TABLE);
Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();
}
利用刚才实例化的helper调用getWriteDatabase获取一个SQLiteDatabase:
SQLiteDatabase database = helper.getWritableDatabase();
有了database对象就可以对数据表进行增删改查(crud)。
升级数据库
添加数据
首先把要添加到数据库的数据装进ContentValues里面,下面就示范添加用户毛毛,密码maomao(毛毛是一条贵宾犬~~~每天都在笔者的宿舍乱蹦乱跳的):
ContentValues value = new ContentValues();
value.put("username", “毛毛”);
value.put("password", "maomao");
database.insert("user", null, value);
SQLiteDatabase中提供了一个insert()方法,这个方法专门用于添加数据的。接收三个参数,第一个参数是表名,表示向哪个表插入数据。第二个参数是用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,一般我们用不到这个功能传入null即可。第三个参数是一个ContentValue对象,提供了一系列put方法的重载这点跟Map有点相似。只需要将表中的每个列名以及相应的待添加数据传入即可。
就这样就往user表中添加了用户名为毛毛,密码为maomao的用户了。
更新数据
更新数据也就是数据库中的增删改查中的改,同样的是使用SQLiteDatabase对象进行操作。
在SQLiteDatabase中有一个update(0方法用于对数据进行更新。这个方法接收四个参数,第一个参数同样也是表名,指定更新哪张表的数据。
第二个参数是ContentValues对象,把更新的数据放进去。
第三,四个参数是约束更新哪一行中的数据。
上面添加了毛毛这个用户,密码为maomao。密码与用户名的关联太大,导致密码很容易被人破解因此需要对毛毛的密码进行修改。这时应该怎样做呢?
<pre name="code" class="java"> ContentValues values = new ContentValues();
values.put("password", “laomao”);
database.update("user", values, "username=?", new String[]{“毛毛”});
上述代码的意思是把username等于毛毛的那一行中的password列改成老毛。
删除数据
database.delete("user", "username=?", new String[]{“毛毛”);
如果你能理解上面添加与更新的写法,那么删除数据这么简单肯定能够理解了。(偷懒路过)
查询数据
之所以把crud四种操作之中r放在最后是因为查询是最复杂的一种~从sql的中文就是(结构化查询语言)可以知道大部分功能都体现在查询这个功能上。sql的查询博大精深,有兴趣的可以看看笔者之前的博客,有几篇是关于MYsql的,其中会有不少sql语句的用法。,接下来进入正题,SQLiteDatabase中有一个query方法用于查询。可以发现query有好几个重载,最短的那个也要传入七个参数~这里就简单介绍一下简单的用法~查询博大精深篇幅所限说不完啊(又一次偷懒~~)
栗子:我想要查询毛毛的密码:
Cursor cursor = database.query("user", new String[]{"password"}, "username=?", new String[]{”毛毛“}, null, null, null); if(cursor.moveToFirst()){ int index = cursor.getColumnIndex("password"); String password = cursor.getString(index); Toast.makeText(this, password, Toast.LENGTH_LONG).show(); }
第一个参数依然是指定查询哪个表,
第二个参数指定查询的列,
第三个参数指定where约束条件
第四个参数为where重的占位符提供具体的值
第五个参数制定需要group by的列
第六个参数对group by 后的结果进一步约束
第七个参数指定查询结果的排序方式
虽然query方法参数多,但是并不是每次都需要把每个参数都用上的。query方法会返回一个Cursor对象。查询到的所有数据都将从这个对象中取出~最后提供一个小demo