Android数据库更新机制
来源:互联网 发布:网络招聘是做什么的 编辑:程序博客网 时间:2024/06/08 00:42
Android源码:
1、通过下面的构造方法传入新的版本号
/** * 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; }2、当得到数据的读写对象时,进行当前版本号与前版本号的比较,以此确定执行sqlitehelper的oncreate或者onUpgrade或者onDowngrade
public SQLiteDatabase getWritableDatabase() { synchronized (this) { return getDatabaseLocked(true); } }public SQLiteDatabase getReadableDatabase() { synchronized (this) { return getDatabaseLocked(false); } } private SQLiteDatabase getDatabaseLocked(boolean writable) { if (mDatabase != null) { if (!mDatabase.isOpen()) { // Darn! The user closed the database by calling mDatabase.close(). mDatabase = null; } else if (!writable || !mDatabase.isReadOnly()) { // The database is already open for business. return mDatabase; } } if (mIsInitializing) { throw new IllegalStateException("getDatabase called recursively"); } SQLiteDatabase db = mDatabase; try { mIsInitializing = true; if (db != null) { if (writable && db.isReadOnly()) { db.reopenReadWrite(); } } else if (mName == null) { db = SQLiteDatabase.create(null); } else { try { if (DEBUG_STRICT_READONLY && !writable) { final String path = mContext.getDatabasePath(mName).getPath(); db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY, mErrorHandler); } else { db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ? Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0, mFactory, mErrorHandler); } } catch (SQLiteException ex) { if (writable) { throw ex; } Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", ex); final String path = mContext.getDatabasePath(mName).getPath(); db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY, mErrorHandler); } } onConfigure(db); final int version = db.getVersion(); if (version != mNewVersion) { if (db.isReadOnly()) { throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " + mNewVersion + ": " + mName); } db.beginTransaction(); try { if (version == 0) { onCreate(db); } else { if (version > mNewVersion) { onDowngrade(db, version, mNewVersion); } else { onUpgrade(db, version, mNewVersion); } } db.setVersion(mNewVersion); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } onOpen(db); if (db.isReadOnly()) { Log.w(TAG, "Opened " + mName + " in read-only mode"); } mDatabase = db; return db; } finally { mIsInitializing = false; if (db != null && db != mDatabase) { db.close(); } } }
数据库的更新机制似乎到此完结了。但是大家不晓得有没有注意到db.getVersion(); 我们把应用缓存数据库文件导出来会发现,并没有version之类的字段,那么数据库的版本又是通过什么标示的呢?
继续查看源码:
/** * Gets the database version. * * @return the database version */ public int getVersion() { return ((Long) DatabaseUtils.longForQuery(this, "PRAGMA user_version;", null)).intValue(); }
而PRAGMA 详细可参见 http://hi.baidu.com/dushm/item/6d8cc8d6faf1111e21e25026 是sqlite的一条编译指令
到此为止!
0 0
- Android数据库更新机制
- android热更新机制
- android热更新机制
- android热更新机制
- android热更新机制
- android Ormlite数据库更新
- android 本地数据库更新
- android数据库更新
- android 数据库更新
- android 数据库更新
- Android之数据库更新
- android数据库更新简介
- Android数据库更新解释
- Android 系统时间更新机制
- android中apk更新机制
- Android 时间更新机制研究
- Android系统时间更新机制
- Android Cursor 查询更新数据库
- Lua闭包(closure)示例
- 什么是J2EE?
- javascript文件夹选择框的两种解决方案
- 第六周(项目三)——用多文件组织多个类的程序。
- 用EasyX图形库VS2012的控制台的二维图形的绘制(仅限C++)
- Android数据库更新机制
- C# 之泛型
- google In-app Billing FAQ
- Unicode字符串转UTF-8 (C++)
- 【js学习笔记-114】----<canvas>矩形、颜色、透明度、渐变及图案
- Uva 10312 - Expression Bracketing 解题报告(卡特兰数+递推)
- windows phone7资料整理
- SSH Secure Shell Client中文乱码的解决办法
- 一些常见的项目行为状态