getWritableDatabase()与getReadableDatabase()的区别:
getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的
getReadableDatabase取得的实例也是具对数据库进行读和写的功能。
两者的区别在于
getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)
getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库
具体使用:
/** 空间不够存储的时候设为只读
* @throws SQLiteException
*/
public void open() throws SQLiteException
{
dbOpenHelper = new DBOpenHelper(xContext, DB_NAME, null,DB_VERSION);
try
{
db = dbOpenHelper.getWritableDatabase();
}
catch (SQLiteException e)
{
db = dbOpenHelper.getReadableDatabase();
}
}
/**
* 静态Helper类,用于建立、更新和打开数据库
*/
private static class DBOpenHelper extends SQLiteOpenHelper
{
/*
* 手动创建表的SQL命令
CREATE TABLE peopleinfo
(_id integer primary key autoincrement,
name text not null,
age integer,
height float);*/
private static final String DB_CREATE=
"CREATE TABLE "+DB_TABLE
+" ("+KEY_ID+" integer primary key autoincrement, "
+KEY_NAME+" text not null, "
+KEY_AGE+" integer,"+
KEY_HEIGHT+" float);";
public DBOpenHelper(Context context, String name,
CursorFactory factory, int version)
{
super(context, name, factory, version);
}
/*
* 函数在数据库第一次建立时被调用,
* 一般用来用来创建数据库中的表,并做适当的初始化工作
*/
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DB_CREATE);
Log.i(DB_ACTION, "onCreate");
}
/*
* SQL命令。onUpgrade()函数在数据库需要升级时被调用,
* 通过调用SQLiteDatabase对象的execSQL()方法,
* 执行创建表的一般用来删除旧的数据库表,并将数据转移到新版本的数据库表中
*/
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion)
{
//为了简单起见,并没有做任何的的数据转移,而仅仅删除原有的表后建立新的数据库表
_db.execSQL("DROP TABLE IF EXISTS "+DB_TABLE);
onCreate(_db);
Log.i(DB_ACTION, "Upgrade");
}
}