Android——数据存储(三)(SQLite存储)
SQLite存储
SQLite是Android系统内置的数据库,是一款轻量级的关系型数据库,支持标准的SQL语法,数据库文件存放在/data/data/<package name>/database/目录下。
Android提供了一个帮助类SQLiteOpenHelper来简单的对数据库进行创建和升级,SQLiteOpenHelper是抽象类,需要重写两个抽象方法:onCreate()和onUpgrade(),分别实现创建和升级数据库。
- onCreate(SQLiteDatabase db):第一次创建数据库时调用。
- onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):当数据库需要升级时调用。
SQLiteOpenHelper中还有两个实例方法用于创建或打开一个数据库(数据库存在就直接打开,不存在就创建一个新数据库),并返回一个可对数据库进行读写操作的对象(SQLiteDatabase):getReadableDatabase()和getWritableDatabase()。
添加数据两种方式(行):
(1)获取SQLiteDatabase对象,然后使用ContentValues来对要添加的数据进行组装:put(),然后调用SQLiteDatabase对象的insert()方法将ContentValues数据添加到数据库表中:
SQLiteDatabase db = dbhelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name","The Da Vinci Code"); values.put("author","Dan Brown"); values.put("pages",454); values.put("price",16.96); db.insert("Book",null,values);
put()方法的第一个参数是要插入数据的索引,第二个参数是要插入的数据。
Insert()方法的第一个参数是要插入的表的名字,第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,第三个参数是一个ContentValues对象。
(2)获取SQLiteDatabase对象,调用execSQL()方法执行SQL插入语句:
SQLiteDatabase db = dbhelper.getWritableDatabase(); db.execSQL(“insert into Book (name,author,pages,price) values(?,?,?,?)”,new String[]{“The Da Vinci Code”,” Dan Brown”,” 454”,” 16.96”});
更新数据的两种方式:
(1)获取SQLiteDatabase对象,使用ContentValues来对要更新的数据进行组装,然后调用SQLiteDatabase对象的update()方法将ContentValues数据更新到数据库表中:
SQLiteDatabase db = dbhelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("price",10.99); db.update("Book",values,"name = ?",new String[]{"The Da Vinci Code"});
update()方法的第一个参数是要插入的表的名字,第二个参数是ContentValues对象,要把更新的数据在这里组装进去,第三、四个参数用于约束更新某一行或某几行的数据,不指定的话默认就是更新所有行。
(2) 获取SQLiteDatabase对象,调用execSQL()方法执行SQL更新语句:
SQLiteDatabase db = dbhelper.getWritableDatabase(); db.execSQL(“update Book set price = ? where name = ?”,new String[]{“10.99”,” The Da Vinci Code”});
删除数据的两种方式:
(1)获取SQLiteDatabase对象,调用delete()方法进行删除操作:
SQLiteDatabase db = dbhelper.getWritableDatabase(); db.delete("Book","pages > ?",new String[]{"500"});
delete()方法第一个参数是要插入的表的名字,第二、三个参数是用于约束删除某一行或某几行的数据,不指定的话就是默认删除所有行。
(2)获取SQLiteDatabase对象,调用execSQL()方法执行SQL删除语句:
SQLiteDatabase db = dbhelper.getWritableDatabase(); Db.execSQL(“delete from Book where pages > ?”,new String[]{“500”});
查询数据的两种方式:
(1)获取SQLiteDatabase对象,调用query()方法进行查询(这里只详细讲解七个参数的):
query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
query()方法参数 |
对应SQL部分 |
描述 |
table |
From table_name |
指定查询的表名 |
columns |
Select column1,column2 |
指定返回查询结果的列名 |
selection |
Where column = value |
指定where的约束条件 |
selectionArgs |
- |
为where中的占位符(?)提供具体的值 |
groupBy |
Group by column |
指定需要group by的列 |
having |
Having column = value |
对group by后的结果进一步约束 |
orderBy |
Order by column1,column2 |
指定查询结果的排序方式 |
返回一个Cursor对象,查询的所有数据将从这个对象中取出。
查询书本页数大于400的书的信息:
SQLiteDatabase db = dbhelper.getWritableDatabase(); Cursor cursor = db.query("Book",new String[]{"name","author","pages","price"},"pages > ?",new String[]{"400"},null,null,null);
查询所有书的信息:
SQLiteDatabase db = dbhelper.getWritableDatabase(); Cursor cursor = db.query("Book",null,null,null,null,null,null);
(2)获取SQLiteDatabase对象,调用rawQuery()方法进行查询:
rawQuery (String sql, String[] selectionArgs)
查询书本页数大于400的书的信息:
SQLiteDatabase db = dbhelper.getWritableDatabase(); Cursor cursor = db.rawQuery("select * from Book where pages > ?",new String[]{"400"});
查询所有书的信息:
SQLiteDatabase db = dbhelper.getWritableDatabase(); Cursor cursor = db.rawQuery("select * from Book ",null);
提取查询到的数据,调用Cursor对象的moveToFirst()方法将数据的指针移动到第一行的位置,然后进入到循环中,遍历查询到的每一行数据,getColumnIndex()用于获取某一列在表中对应的位置索引。然后将这个索引传入到相应的取值方法中就可以提取出数据了,每遍历一次就调用moveToNext()方法将数据指针移动到下一行:
if (cursor.moveToFirst()){ do { //遍历cursor对象,取出数据打印 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("MainActivity","book name is "+name); Log.d("MainActivity","book author is "+author); Log.d("MainActivity","book pages is "+pages); Log.d("MainActivity","book price is "+price); }while (cursor.moveToNext()); } cursor.close();