SQLiteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。SQLiteOpenHelper是一个抽象类,所以我们想要使用它,就必须创建它的子类,并且拓展它的onCreate(SQLiteDatabase db)和onUpdate(SQLiteDatabase db,int oldVersion,int newVersion)方法。
SQLiteOpenHelper包含如下常用方法:
构造函数
/** * Create a helper object to create, open, and/or manage a database. * This method always returns very quickly. The database is not actually * created or opened until one of {@link #getWritableDatabase} or * {@link #getReadableDatabase} is called. * * @param context to use to open or create the database * @param name of the database file, or null for an in-memory database * @param factory to use for creating cursor objects, or null for the default * @param version number of the database (starting at 1); if the database is older, * {@link #onUpgrade} will be used to upgrade the database; if the database is * newer, {@link #onDowngrade} will be used to downgrade the database */ public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { this(context, name, factory, version, null); } /** * Create a helper object to create, open, and/or manage a database. * The database is not actually created or opened until one of * {@link #getWritableDatabase} or {@link #getReadableDatabase} is called. * * <p>Accepts input param: a concrete instance of {@link DatabaseErrorHandler} to be * used to handle corruption when sqlite reports database corruption.</p> * * @param context to use to open or create the database * @param name of the database file, or null for an in-memory database * @param factory to use for creating cursor objects, or null for the default * @param version number of the database (starting at 1); if the database is older, * {@link #onUpgrade} will be used to upgrade the database; if the database is * newer, {@link #onDowngrade} will be used to downgrade the database * @param errorHandler the {@link DatabaseErrorHandler} to be used when sqlite reports database * corruption, or null to use the default error handler. */ public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { if (version < 1) throw new IllegalArgumentException("Version must be >= 1, was " + version); mContext = context; mName = name; mFactory = factory; mNewVersion = version; mErrorHandler = errorHandler; }
onCreate(SQLiteDatabase db)
<span style="font-family:SimSun;">/** * Called when the database is created for the first time. This is where the * creation of tables and the initial population of the tables should happen. * * @param db The database. */ public abstract void onCreate(SQLiteDatabase db);</span>onUpdate(SQLiteDatabase db,int oldVersion,int newVersion)
<span style="font-size:18px;"> /** * Called when the database needs to be upgraded. The implementation * should use this method to drop tables, add tables, or do anything else it * needs to upgrade to the new schema version. *...</span><pre name="code" class="java"><span style="font-size:18px;"> *</span>... * @param db The database. * @param oldVersion The old database version. * @param newVersion The new database version. */ public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);getWritableDatabase()
<span style="font-size:18px;"> /** * Create and/or open a database that will be used for reading and writing. * The first time this is called, the database will be opened and * {@link #onCreate}, {@link #onUpgrade} and/or {@link #onOpen} will be * called. *...... * @throws SQLiteException if the database cannot be opened for writing * @return a read/write database object valid until {@link #close} is called */ public SQLiteDatabase getWritableDatabase() { synchronized (this) { return getDatabaseLocked(true); } }</span>getReadableDatabase()
<span style="font-size:18px;">/** * Create and/or open a database. This will be the same object returned by * {@link #getWritableDatabase} unless some problem, such as a full disk, * requires the database to be opened read-only. In that case, a read-only * database object will be returned. If the problem is fixed, a future call * to {@link #getWritableDatabase} may succeed, in which case the read-only * database object will be closed and the read/write object will be returned * in the future. * * * * @throws SQLiteException if the database cannot be opened * @return a database object valid until {@link #getWritableDatabase} * or {@link #close} is called. */ public SQLiteDatabase getReadableDatabase() { synchronized (this) { return getDatabaseLocked(false); } }</span>
onClose()
<span style="font-family:SimSun;font-size:18px;"> /** * Close any open database object. */ public synchronized void close() { if (mIsInitializing) throw new IllegalStateException("Closed during initialization"); if (mDatabase != null && mDatabase.isOpen()) { mDatabase.close(); mDatabase = null; } }</span>onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
<span style="font-family:SimSun;font-size:18px;"> /** * Called when the database needs to be downgraded. This is strictly similar to * {@link #onUpgrade} method, but is called whenever current version is newer than requested one. * However, this method is not abstract, so it is not mandatory for a customer to * implement it. If not overridden, default implementation will reject downgrade and * throws SQLiteException * * <p> * This method executes within a transaction. If an exception is thrown, all changes * will automatically be rolled back. * </p> * * @param db The database. * @param oldVersion The old database version. * @param newVersion The new database version. */ public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { throw new SQLiteException("Can't downgrade database from version " + oldVersion + " to " + newVersion); }</span>
其中,这个类有两个构造函数,我们这只要看SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version,
DatabaseErrorHandler errorHandler)就行了,
context用于打开或新建数据库的上下文,
name 数据库文件的名称,如果为空,那么使用的就是内存中的数据库了,
factory 用于新建cursor对象的,为空的话就是用默认的,
version 数据库的版本号(从1开始),如果当前的数据库是旧的,那么会调用onUpgrade来更新数据库,反之,会调用onDowngrade方法来回退数据库
errorHandler 当sqlite记录数据库损毁会使用它,一般设为null用默认的。
onCreate(SQLiteDatabase db):只在数据库第一次创建时才会被调用,通常在这个方法里面会做一些建表和数据初始化的操作。
onUpdate(SQLiteDatabase db,int oldVersion,int newVersion):当数据库需要升级的时候会调用这个方法,在这个方法中,应该做一些数据库表结构的更新操作。oldVersion代表数据库之前的版本号,newVersion代表当前数据库的版本号。那么在哪里指定数据库的版本号呢?当我们创建SQLiteOpenHelper对象时,必须指定一个version参数,该参数就决定了所使用的数据库的版本——也就是说,数据库的版本是由我们自己来控制的,只要某次创建SQLiteOpenHelper对象时指定的版本号高于之前的版本号,就会触发这个方法。特别指出,这个方法是在一个事物中执行的,也就是说这方法执行的过程中一旦发生了异常,那么所有的改变都会自动的回滚。
onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) 当数据库需要降级的时候会调用。严格的来说,这个方法和onUpdate方法是一样的。不过它和onUpdate的区别在于:
1、onDowngrade 用于版本回退,也就是当newVersion小于oldVersion的时候会调用,
2、onDowngrade不是抽象方法,没有强制我们去实现它,默认的它会抛出SQLiteException异常。
3、onDowngrade要求的api版本最低是10,10之前是没有的。
getWritableDatabase()新建或者打开一个用于读写的数据库,第一次被调用的时候,数据库会被打开,并且onCreate,onUpgrade或onOpen(注:如果数据库已经被打开,就会调用这个方法,如果还没有被打开,调用的是onUpgrade或者onDowngrade)会被调用。
getReadableDatabase()新建或者打开一个数据库。如果没有问题的话,调用该方法得到的数据库和通过调用getWritableDatabase()方法来得到的数据库是一样的。但如果磁盘满了,得到的只是一个只读的数据库,倘若使用getWritableDatabase()打开数据库就会报错。
onClose() 关闭所有的数据库对象。但我们完成了数据库操作之后,必须去关闭数据库连接,否则会发生内存泄漏。
总的来说SQLiteOpenHelper类就这么些东西,挺简单的。
Android之Sqlite开发(1)—简介