构造函数,调用父类 SQLiteOpenHelper 的构造函数
onCreate()方法;// TODO 创建数据库后,对数据库的 *** 作
onUpgrage()方法。// TODO 更改数据库版本的 *** 作
当你完成了对数据库的 *** 作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
其主要思路是:1. 把数据库分解成几个asset文件。
2. 当需要打开数据库时,如果数据库不存在,就把那几个asset文件重新合并成一个数据库文件。
3. 如果数据库的版本改变了,就在onUpgrade()方法中把数据库文件删除掉。
下面是代码:
//数据库的缺省路径
private static finalString DB_PATH = "/data/data/com.mypackage.myapp/databases/"
private static finalString DB_NAME = "mydb.db"
private static finalint DB_VERSION = 2
private static finalString DB_SPLIT_NAME = "mydb.db.00"
private static finalint DB_SPLIT_COUNT = 3
private SQLiteDatabasem_database
private final Contextm_context
/**
* Constructor
*保存传进来的context参数以用来访问应用的asset和资源文件。
* @param context
*/
public MyDB(Contextcontext) {
super(context, DB_NAME, null, DB_VERSION)
this.m_context = context
}
public static MyDBopenDatabaseReadOnly(Context context) {
MyDB db = new MyDB(context)
try {
db.createDataBase()
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
db.openDataBase(SQLiteDatabase.OPEN_READONLY)
return db
}
public static MyDBopenDatabaseReadWrite(Context context) {
MyDB db = new MyDB(context)
try {
db.createDataBase()
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
db.openDataBase(SQLiteDatabase.OPEN_READWRITE)
return db
}
/**
*创建一个空数据库,用来存储你已有的数据库。
*/
public voidcreateDataBase() throws IOException{
boolean dbExist =checkDataBase()
if (dbExist) {
/*
**如果你的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时
**传进去的是可写的数据库。
*/
SQLiteDatabase db =this.getWritableDatabase()
if (db != null) {
db.close()
}
}
dbExist = checkDataBase()
if (!dbExist) {
try {
/*
** 调用这个方法以确保在缺省路径内产生一个空数据库,以便在其基础上复制我们已有的数据库。
*/
SQLiteDatabase db =this.getReadableDatabase()
if (db != null) {
db.close()
}
copyDataBase()
}
catch (IOException e) {
Log.e("DB", e.getMessage())
throw new Error("Error copyingdatabase")
}
}
}
/**
* 检查数据库是否已存在,以避免重复复制。
* @return true if it exists, false if itdoesn't
*/
private static booleancheckDataBase(){
SQLiteDatabase checkDB = null
try {
String path = DB_PATH + DB_NAME
checkDB =SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY)
}
catch (SQLiteException e){
//database does't exist yet.
}
if (checkDB != null) {
checkDB.close()
}
return checkDB != null ? true : false
}
/**
* 把存在asset文件中的数据库复制的刚创建的空数据库中。
* */
private voidcopyDataBase() throws IOException {
// 刚创建的空数据库的路径
String outFileName = DB_PATH + DB_NAME
// 打开空数据库
OutputStream output = new FileOutputStream(outFileName)
byte[] buffer = new byte[1024*8]
AssetManager assetMgr =m_context.getAssets()
for (int i = 1i <= DB_SPLIT_COUNTi++){
// 打开分解的asset文件
String fn = DB_SPLIT_NAME +String.valueOf(i)
InputStream input = assetMgr.open(fn)
//Log.i("DB", "opened" + fn)
int length
while ((length = input.read(buffer)) >0) {
//Log.i("DB", "read" + String.valueOf(length))
output.write(buffer, 0, length)
//Log.i("DB", "write" + String.valueOf(length))
}
input.close()
}
//Close the streams
output.flush()
output.close()
}
/**
* 打开数据库。
* */
private voidopenDataBase(int flags) throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME
m_database =SQLiteDatabase.openDatabase(myPath, null, flags)
}
/**
* 关闭数据库。
* */
@Override
public synchronizedvoid close() {
if (m_database != null)
m_database.close()
super.close()
}
}
@Override
public voidonCreate(SQLiteDatabase db) {
// 不需做任何事
}
/**
* 在数据库版本提高时,删除原有数据库。
* */
@Override
public voidonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion >oldVersion) {
m_context.deleteDatabase(DB_NAME)
}
}
onCreate()仅在数据库文件不存在需要创建时调用,否则不调用。onUpgrade() 数据库升级时调用 (也即要创建的版本高于当前版本,就会调用这个函数)
改进构造函数,若程序仅仅使用一个数据库,则可以将构造函数里面原本的四个参数在super()中默认三个,
DatabaseHelper dbh = new DatabaseHelper
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)