package com.cnfol.sqlitedb;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
/*
为了判断数据库是否包含news_inf数据表,采用的
方法十分烦锁:程序先尝试向news_inf数据表中插入记录,如果程序
抛出异常,在异常中捕获的catch块中创建news_inf数据表,然后再
插入记录。
那到底是否有一种更优雅的方式来处理这种问题呢?
有,Android提供了SQLiteOpenHelper类来处理这个问题。
实际项目中很少用SQLiteDatabase的方法来打开数据库,
通常都是会继承SQLiteOpenHelper开发子类,并通过该类的
getReadableDatabale(),getWriteableDatabase()
方法打开数据库。
SQLiteOpenHelper是Android提供的一个管理数据库的工具类
可用于管理数据库的创建和版本更新。一般的用法是创建SQLiteOpenHelper
的子类,并扩展它的onCreate(SQLiteDatabase db)和
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)方法
*/
public class SQLiteOpenHelper extends android.database.sqlite.SQLiteOpenHelper{
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 以读写的方式打开数据库对应的SQLiteDatabase对象
* @return
*/
@Override
public SQLiteDatabase getReadableDatabase() {
return super.getReadableDatabase();
}
/**
*以写的方式打开数据库对应的SQLiteDatabase对象
* @return
*/
@Override
public SQLiteDatabase getWritableDatabase() {
return super.getWritableDatabase();
}
/**
* 当第一次创建数据库时回调该方法
*
* 用于初次使用软件时生成数据库表,当调用SQLiteOpenHelper的
* getWritableDatabase()或者getReadableDatabase()方法
* 获取用于操作数据库的SQLiteDatabase实例时,如果数据库不存在,
* Android系统会自动生成一个数据库,接着调用onCreate()方法,
* onCreate()方法在初次生成数据库时才会被调用,重写onCreate()
* 方法时,可以生成数据库表结构及添加一些应用使用到的初始化数据
*
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
}
/**
* 当数据库版本更新时回调该方法
*
* 用于升级软件时更新数据库表结构,方法在数据库的版本发生改变时
* 会被调用,该方法调用时oldVersion代表数据库之前的版本号,
* newVersion代表当前数据库当前的版本号。
*
* 那么在那里指定数据库的版本号呢?当程序创建SQLiteOpenHelper对象
* 时,必须指定一个version参数,该参数就决定了使用的数据库的版本--
* 也就是说,数据库的版本是由程序员控制的。只要某次创建SQLiteOpenHelper
* 时指定的数据库版本号高于之前指定的版本号,系统就会自动触发onUpgrade()
* 方法里面根据原版号和目标版本号进行判断,即可根据版本号进行必需的表结构
* 更新。
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/**
* 关闭所有打开的SQLiteDatabase.
*/
@Override
public synchronized void close() {
super.close();
}
/**
* 从上面方法介绍中不难看出,SQLiteOpenHelper提供了getReadableDatabase()、
* getWritableDatabase()两个方法用于打开数据库连接,并提供了close方法来
* 关闭数据库连接,而开发者需要做的就是重写它的两个抽象方法。
*/
/**
* 提示:
* 实际上,当应用程序升级表结构时,完全可能因为已有数据库导致
* 升级失败。在这种时候程序可能需要先对数据进行转储,清空数据表中
* 的记录,接着对数据表进行更新,当数据表更新完成后再将数据保存会来。
*/
/**
* 一旦得到了SQLiteOpenHelper对象之后,程序无须使用SQLiteDatabase
* 的静态方法创建SQLiteDatabase实例,而且可以使用getWritableDatabase()
* 或getReadableDatabase()方法来获取一个用于操作数据库的SQLiteDatabase
* 实例。
*
* 其中getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘
* 空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开
* 数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,
* 如果数据库的磁盘空间满了,就会打开失败,当打开失败后继续尝试以只读方式打开
* 数据库。
*/
}
SQLiteOpenHelper 介绍
最新推荐文章于 2024-04-17 16:35:42 发布