SQLite的基本使用
- SQLite数据库的基本使用就是增删改查(CURD)。
Android提供了一个SQLiteOpenHelper
== 抽象类让我们更加方便的管理数据库,
SQLiteOpenHelper就是“数据库打开帮助者”,既然是抽象类,
就意味着要创建一个类去继承它。SQLiteOpenHelper有两个抽象方法,分别是onCreate()
和onUpgrade()
,我们必须在自己创建的类中重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。 - 这是自己创建的帮助类 ,让他去继承SQLiteOpenHelper并重写onCreate()和onUpgrade()方法。SQLiteOpenHelper中有两个构造方法,一般使用参数较少的那个构造方法。这个构造方法接收四个参数,分别是
(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
,第一个参数context就是上下文对象,第二个参数name是你需要创建的数据库的名字,第三个参数允许我们在查询数据的时候返回一个cursor对象,这个参数一般传入null,第四个参数version是数据库的版本号。
public class DBHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"+"name text)";
private Context context;
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Log.d("111","数据库创建成功");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
- SQLiteOpenHelper中还有两个非常重要的方法,分别是
getReadableDatabase()
和getWritableDatabase
。这两个方法都可以创建或打开一个现有的数据库(如果数据库已经存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的(Database)类对象。 - 帮助类DBHelper类完成重写以后,接下来就是去主类里边获得可读写的数据库对象。
DBHelper helper = new DBHelper(this,"stu.db",null,1);
SQLiteDatabase db = helper.getWritableDatabase();
这里咱们直接获取到可读写的数据库对象db,接下来的CURD,全通过db的方法来实现。
增加数据
- 方法一
ContentValues values = new ContentValues();
values.put("name","第一行代码");
values.put("id",1);
values.put("author","郭霖");
values.put("price",16.96);
values.put("pages",500);
db.insert("Book",null,values);
values.clear();
db.close();
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
- 方法二
db.execSQL("insert into Book (name,author,pages,price)values(?,?,?,?)",
new String[]{"第二行代码","郭霖二号 ","188","15.999"});
删除数据
- 方法一
db.delete("Book","pages>?",new String[]{"200"});
- 方法二
db.execSQL("delete from Book where id = 1");
更新数据
- 方法一
ContentValues valu = new ContentValues();
valu.put("price",11.11);
db.update("Book",valu,"name = ?",new String[]{"第一行代码"});
- 方法二
db.execSQL("update Book set price = ? where name = ?",new String[] {"100.23","第一行代码"});
查询数据
- 方法一
Cursor cursor = db.query("Book",null,null,null,null,null,null);
Database的query()
方法的参数很复杂,最短的一个方法重载也需要传入7个参数。七个参数分别是:
String table, String[] columns,String selection, String[] selectionArgs, String groupBy,
String having, String orderBy
第一个参数不用多说,是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询那几列,如果不指定则查询所有列;第三、第四个参数用于约束查询某一行或者某几行的数据,不指定则默认查询所有行的数据;第五个参数用于指定需要去groupBy的列,不指定则不对查询结果进行groupBy操作;第六个参数用于对groupBy进行进一步的过滤,不指定则表示不过滤;第七个参数用于指定查询结果的排序方式,不指定则表示使用默认是排序方式。
query()
方法返回的一个是Cursor对象,接着我们调用cursor的moveToFirst()
方法将数据的指针移动到第一行的位置,然后进入到一个循环当中,去遍历查询每一行的数据。在这个循环中可以通过Cursor的getColumnIndex()
方法获取某一列在表中对应的位置索引,然后将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了。
if (cursor.moveToFirst()){
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("----------------","书名是"+name+",作者是"+author+",页数是"+pages+",价钱是"+price);
}while (cursor.moveToNext());
}
cursor.close();
- 方法二
Cursor cursor = db.rawQuery("select * from Book",null);
得到Cursor对象以后,接下来的操作和方法一中的步骤相同。
数据库的升级
细心的同学已经发现了在SQLiteOpenHelper
的两个重要的抽象方法中,咱们只在onCreate()
方法中写了代码,而onUpgrade()
中什么也没有。这个方法是用来对数据库进行升级的。 因为在创建数据库的时候,onCreate()
方法只会执行一次。简单来说就是在你创建成功数据库后,运行程序,点击按钮,只有第一次点击会打印出“数据库创建成功”,再点击的话,将没有任何反应,这是因为你在第二次及之后点击的时候,数据库已经存在,不管我们怎么点击,onCreate()
方法都不会再次执行。 所以,当我们想创建第二张表的时候,就遇到了麻烦:创建表的语句是写在onCreate()
方法里边的,但是onCreate()
不会重复执行。 解决这个问题的办法也相当简单,只需要将程序卸载掉,然后重新运行,就可以了。但是,通过卸载程序的方式来新增一张表无疑是非常极端的做法。 其实我们只需要巧妙地运用SQLiteOpenHelper
的升级功能就可以很轻松地解决这个问题。在onUpgrade()
方法中填写如下代码即可:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exits Book");
onCreate(db);
}
我们在onUpgrade()
方法中执行了DROP
语句,意思就是如果发现数据表已经存在,就将他删除,然后重新执行onCreate()
方法,就可以重新创建。这里先将存在的表删除,因为如果在创建表的时候发现这张表已经存在了,就会直接报错。
接下来就是让onUpgrade()
方法执行,还记得SQLiteOpenHelper
的构造方法吗,他的第四个参数version
是数据库的版本号,之前我们传入的版本号是1,在接下来实列化对象时,只需要把参数改成一个比1大的数,onUpgrade()
方法就会得到执行。
这些只是SQLite最基本的用法,更深入更简单的方法,需要同学们去探索。此篇文章属个人在学习路上的“学习笔记”,如有错误,请联系我修改,不胜感激!