SQLite是一款轻量级的关系型数据库。Android提供了SQLiteOpenHelper类用于管理数据库。
SQLiteOpenHelper类
SQLiteOpenHelper是抽象类。
构造函数
SQLiteOpenHelper(Context, String, CursorFactory, int):
参数:
Context:
String:数据库名,创建数据库时使用这个名称
CursorFactory:Cursor对象,允许在查询数据的时候返回一个自定义的Cursor,一般传入null
int:当前数据库的版本号,在升级数据库的时候会用到
实例方法
getReadableDatabase():可以创建或者打开或者升级已有的数据库,并返回可对数据库进行读写操作的SQLiteDatabase对象。此方法首先判断当前程序中是否有同名数据库,如果没有的话,创建数据库并调用onCreate()方法;如果有的话,判断版本号,版本号增加则升级,否则直接打开。
getWritableDatabase():同上。和getReadableDatabase()不同的是,当数据库不可写入时,getWritableDatabase()将出现异常,getReadableDatabase()返回只可以读数据库的对象。
抽象方法
onCreate(SQLiteDatabase):创建数据库的逻辑,比如在此函数中添加创建表的语句 db.execSQL(create_table_string)
,建表语句写成字符串create_table_string
onUpgrade(SQLiteDatabase, int, int):升级数据库的逻辑,在其中添加删除表的语句db.execSQL("drop table if exists table_name")
,并调用onCreate()方法
SQLiteOpenHelper类按如下步骤使用
定义继承自SQLiteOpenHelper的类MySQLHelper
public class MySQLHelper extends SQLiteOpenHelper{
public static final String CREATE_STUDENT = "create table Student ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer)";
private Context mContext;
public MySQLHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_STUDENT);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrage(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
得到MySQLHelper的一个实例
MySQLHelper dbHelper = new MySQLHelper(this, "School.db", null, 1);
调用getWritableDatabase()返回可对数据库读写的对象
dbHelper.getWritableDatabase();
对表中数据的操作
SQLiteDatabase对象可以对数据库进行操作。
增
db.insert(String, , ContentValues)
参数:
String:表名
:一般传入null
ContentValues:要插入的记录。通过调用其put方法,并传入表中的列名以及对应的数据值。
dbHelper = new MySQLHelper(this, "School.db", null, 2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues record = new ContentValues();
record.put("name", "V");
record.put("age", 12);
db.insert("Student", null, record);
record.clear();
record.put("name", "John");
record.put("age", 15);
db.insert("Student", null, record);
删
db.delete(String, , ):
参数:
String:表名
后两个参数用于约束删除某一行或者某几行的数据,不指定的话删除所有行
db.delete("Student", "age>?", new String [] {"12"})
查
db.query(String table, String[] columns, String selections, String[] selectionArgs, String groupBy, String having, String orderBy):
参数:
table:表名
columns:查询哪几列,不指定的话查询所有列
第三个和第四个参数用于约束查询某一行或者几行的数据,不指定的话查询所有行;
第五个参数指定需要对查询结果进行group by的列,不指定的话不对查询结果进行group by;
第六个参数对group by之后的结果进一步过滤,不指定的话表示不过滤;
第七个参数指定查询结果的排序方式。
Cursor cursor = db.query("Student", null, null, null, null, null, null);#查询Student中所有数据
if (cursor.moveToFirst()){
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
}while (cursor.moveToNext());
}
cursor.close();
改
db.update(String, ContentValues, String, String []):
参数:
String:表名
ContentValues:更新数据
最后两个参数用于约束修改某一行或者几行的数据,不指定的话修改所有行。第三个参数对应SQL语句的where。
ContentValues record = new ContentValues();
record.put("age", 13);
db.update("Student", record, "name=?", new String [] {"V"});//?是占位符,第四个参数提供的字符串数组中的每个字符串去填充?,应该在内部执行了一个for循环。
还可以通过SQL语句进行增删查改。
其他
onCreate方法的使用
假设要向数据库中再添加一个表,在onCreate()方法中添加一条建表语句,但是由于同名数据库已经存在,并不会再次执行onCreate()。这里就需要用到onUpgrade()方法。但是如何让onUpgrade()方法执行?既然问这个问题,就表明和onCreate()方法一样并不是开发者显式调用。秘密在数据库的版本号上。只要修改构建MySQLHelper实例时传入的版本号,使其比之前大,就会执行onUpgrade()方法。
public class MySQLHelper extends SQLiteOpenHelper{
public static final String CREATE_STUDENT = "create table Student ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer)";
public static final String CREATE_TEACHER = "create table Teacher ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer)";
private Context mContext;
public MySQLHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_STUDENT);
db.execSQL(CREATE_TEACHER);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrage(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("drop table if exists Student");
db.execSQL("drop table if exists Teacher");
onCreate(db);
}
}
MySQLHelper dbHelper = new MySQLHelper(this, "School.db", null, 2);
数据库的位置
/data/data/com.example.victoria.mediaplayer/databases/