SQLite数据库存储
一.创建数据库
Android提供了一个**抽象类**SQLiteOpenHelper,借助这个类就可以进行数据库的创建和升级了。
首先建立MySQLiteOpenHelper类继承SQLiteOpenHelper,在onCreate()方法中创建建表的逻辑:
public class MyDataBaseHelper extends SQLiteOpenHelper {
static final String CREATE = "create table person (id integer primary key autoincrement,name text,age integer)";
public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
借助MySQLiteOperHelper中的getWriteableDatabase()/getReadableDatabase()方法得到数据库的实例:
MyDataBaseHelper helper = new MyDataBaseHelper(this,"database",null,1);
SQLiteDatabase writableDatabase = helper.getWritableDatabase();
此时在/data/data//databases/目录下即会生成一个数据库文件了。
二.添加数据
添加数据有两种方法,你可以通过sql语句进行添加操作,也可以借助Android提供的辅助方法。
1.使用sql语句进行数据添加
writableDatabase.execSQL("insert into person (name,age) values (?,?)",new String[]{"link","55"});
2.使用insert()方法添加数据
ContentValues values = new ContentValues();
values.put("name","jack");
values.put("age",4);
writableDatabase.insert("person",null,values);
values.clear();
三.更新数据
1.使用sql语句更新数据
writableDatabase.execSQL("update person set age = ? where name = ?",new String[]{"33","jack"});
2.使用update()方法更新数据
ContentValues values = new ContentValues();
values.put("age",22);
writableDatabase.update("person",values,"name = ?",new String[]{"jack"});
values.clear();
四.删除数据
1.使用sql语句删除数据
writableDatabase.execSQL("delete from person where name = ?",new String[]{"jack"});
2.使用delete()方法删除数据
writableDatabase.delete("person","name = ?",new String[]{"sam"});
五.查询数据
Android提供了query()方法用于对数据的查询,其参数较多:
参数 | 描述 |
---|---|
table | 指定查询的表名 |
colums | 指定查询的类名 |
selection | 指定where的约束条件 |
selectionArgs | where中的占位符具体的值 |
groupBy | 指定需要group by的列 |
having | 对group by后的结果进一步约束 |
orderBy | 指定查询结果的排序方式 |
query()方法会返回一个Cursor对象,查询后的内容就包含在结果集内,对结果集进行相应操作即可取出相应的值。
例如现在有一张表
id | name | age |
---|---|---|
1 | sam | 22 |
2 | jack | 33 |
3 | vincent | 13 |
现在我想查询vincent的age,那么首先使用query()方法,配置好参数:
Cursor cursor = writableDatabase.query("person", new String[]{"age"}, "name = ?", new String[]{"vincent"}, null, null, null);
在cursor中取出age的值,在取出之前先判断是否有name为vincent的行。
if (cursor.moveToFirst()){
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d(TAG,age + "");
}
六.升级数据库
在MyDataBaseHelper类中还空着onUpgrade()方法,当数据库升级时,此方法就会被调用。
现在数据库中已经有了一张person表了,并且版本号为1,现在我要向数据库中添加一张book表,并保证person表中的数据不会丢失。
public class MyDataBaseHelper extends SQLiteOpenHelper {
static final String CREATE_PERSON = "create table person (id integer primary key autoincrement,name text,age integer)";
static final String CREATE_BOOK = "create table book (id integer primary key autoincrement,name text,prince integer)";
public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/***
* 如果是第一次建立数据库,执行此方法;
*/
/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PERSON);
db.execSQL(CREATE_BOOK);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion){
case 1:
db.execSQL(CREATE_BOOK); //如果旧版本号为1,就执行BOOK的建表语句;
default:
}
}
}
那么什么时候会调用这个方法呢?再次构建一个MyDataBaseHelper类,只要最后一个参数(版本号)比之前大,那么就会调用onUpgrade()方法。
“`
MyDataBaseHelper helper_updata = new MyDataBaseHelper(this, "database", null, 2);
“`