• Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点


    以下内容可以作为面试官在面试的时候的问题,感觉比较好,是比较常用的知识点,可以用来考察基础是否扎实。

    也可以程序猿学习、开发中的注意点。因为稍微不注意,就有可能导致数据库不能用。

    DBAdapter.java是一个简单的类,主要用来进行数据库操作。

    复制代码
     1 package com.example.test_20131218;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 
     6 public class DBAdapter {
     7     private static DBAdapter INSTANCE  = null;
     8     private DBOpenHelper mHelper = null;
     9     private SQLiteDatabase mDB = null;
    10     private DBAdapter(Context context){
    11         mHelper = new DBOpenHelper(context);
    12         mDB = mHelper.getWritableDatabase();
    13     }
    14     public static DBAdapter getInstance(Context context){
    15         if(INSTANCE == null){
    16             return new DBAdapter(context);
    17         }
    18         return INSTANCE;
    19     }
    20     public void open(){
    21         if(mDB == null){
    22             mDB = mHelper.getWritableDatabase();
    23         }
    24     }
    25     
    26 }
    复制代码


    DBHelper类:

    复制代码
     1 package com.example.test_20131218;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 import android.database.sqlite.SQLiteOpenHelper;
     6 import android.util.Log;
     7 
     8 public class DBOpenHelper extends SQLiteOpenHelper {
     9     /***
    10      * 数据库的版本必须大于0,否则报错:
    11      * java.lang.RuntimeException: Unable to start activity 
    12      * ComponentInfo{com.example.test_20131218/
    13      * com.example.test_20131218.MainActivity}: java.lang.IllegalArgumentException: Version must be >= 1, was 0
    14      */
    15     public static final int DB_VERSION = 5;
    16     public static final String DB_NAME = "test20131218.db";
    17     
    18     public DBOpenHelper(Context context) {
    19         super(context, DB_NAME, null, DB_VERSION);
    20     }
    21 
    22     @Override
    23     public void onCreate(SQLiteDatabase db) {
    24         /**
    25          * 这个方法
    26          * 1、在第一次打开数据库的时候才会走
    27          * 2、在清除数据之后再次运行-->打开数据库,这个方法会走
    28          * 3、没有清除数据,不会走这个方法
    29          * 4、数据库升级的时候这个方法不会走
    30          */
    31         Log.i("xinye", "#############数据库创建了##############:" + DB_VERSION);
    32     }
    33 
    34     @Override
    35     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    36         /**
    37          * 1、第一次创建数据库的时候,这个方法不会走
    38          * 2、清除数据后再次运行(相当于第一次创建)这个方法不会走
    39          * 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
    40          */
    41         Log.i("xinye", "#############数据库升级了##############:" + DB_VERSION);
    42         
    43     }
    44     @Override
    45     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    46         /**
    47          * 执行数据库的降级操作
    48          * 1、只有新版本比旧版本低的时候才会执行
    49          * 2、如果不执行降级操作,会抛出异常
    50          */
    51         Log.i("xinye", "#############数据库降级了##############:" + DB_VERSION);
    52         super.onDowngrade(db, oldVersion, newVersion);
    53     }
    54 
    55 }
    复制代码


    更多内容请参考大牛博客对Android文档的翻译:http://blog.csdn.net/think_soft/article/details/7969122

    也可以自行百度,Google!

    下面把大牛的博客拷贝过来,以便于以后参考:

    Android类参考---SQLiteOpenHelper

    public 抽象类

    SQLiteOpenHelper

    继承关系

    java.lang.Object

       |____android.database.sqlite.SQLiteOpenHelper

    类概要

    这是一个辅助类,用来管理数据库的创建和数据库的版本。

    你要创建一个这个类的子类来实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法,以及可选的onOpen(SQLiteDatabase)方法,并且这个类要管理数据库的状态,如果数据库存在,就打开数据库,否则就创建数据库,并且在需要的时候也会更新数据库。使用事务来确保数据库始终在正确的状态中。

    这个类让ContentProvider的实现变的容易,它把数据库的打开和升级延迟到第一次使用,从而避免了因升级数据库的长时间运行而造成的应用程序阻塞。

    注意:这个类假设用递增的版本号来升级。

    Public构造器

    public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CuresorFactory factory, int version)

       创建一个辅助对象,用来创建、打开、管理数据库。这个方法始终是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被调用之前,这个数据库不会实际的被创建。

       参数说明:

       context:用于打开或创建数据库;

       name:指定数据库的文件名,null指定一个内存中的数据库

       factory:用于创建游标对象,或默认的null;

       version:指定数据库的版本号(从1开始);如果数据库比较旧,onUpgrade(SQLiteDatabase, int, int)方法将用于升级数据库。如果数据库比较新,onDowngrade(SQLiteDatabase, int, int)方法会被用于降级数据库。

    public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)

       创建一个辅助对象,用来创建、打开、管理数据库。这个方法始终是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被调用之前,这个数据库不会实际的被创建。

       接收输入参数:一个具体的DatabaseErrorHandler示例,用于处理SQLite报告的数据库错误。

       参数说明:

       context:用于打开或创建数据库;

       name:指定数据库的文件名,null指定一个内存中的数据库

       factory:用于创建游标对象,或默认的null;

       version:指定数据库的版本号(从1开始);如果数据库比较旧,onUpgrade(SQLiteDatabase, int, int)方法将用于升级数据库。如果数据库比较新,onDowngrade(SQLiteDatabase, int, int)方法会被用于降级数据库。

       errorHandler:该参数被用于SQLite报告数据库错误,或者是null,使用默认错误处理器。

    Public方法

    public synchronized void close()

    关闭打开的数据库对象。

    public String getDatabaseName()

    返回由构造器传递进来的,正在打开的SQLite数据的名称。

    public SQLiteDatabase getReadableDatabase()

    创建并(或)打开一个数据库,除非因为某些问题,否则这个方法返回的对象会与getWritableDatabase()方法相同,如在磁盘空间不足的情况下,就会要求数据库以只读的方式被打开,在这种情况下,会返回一个只读的数据库。如果问题被修正,继续调用getWritableDatabase()方法也可以成功,这时只读的数据库对象会被关闭,并且会返回一个读写对象。

    getWritableDatabase()方法可能需要很长时间才能返回,因此不应该在应用程序的主线程中调用它,包括ContentProvider.onCreate()方法。

    返回值:返回一个数据库对象,直到getWritableDatabase()或close()方法被调用之前,这个对象都是有效的。

    异常:如果数据不能够被打开,会抛出SQLiteException异常。

    public SQLiteDatabase getWritableDatabase()

    创建并(或)打开一个用于读写的数据库。如果是首次调用这个方法,那么该数据将会被打开,并且onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)和(或)onOpen(SQLiteDatabase)方法会被调用。

    数据库一旦被打开,该数据库就会被缓存,因此在每次需要写数据库时,你都能够调用这个方法。(在不在需要该数据库时,要确保调用close()方法)。诸如没有授权或没有磁盘空间等错误可能会导致这个方法调用失败,但如果这些问题被修正,这个方法就会被调用成功。

    注意:数据库升级可能需要很长时间,因此不要在应用程序的主线程中调用这个方法,包括ContentProvider.onCreate()。

    返回值:一个读写的数据库对象,直到close()方法被调用才失效。

    异常:如果该数据库不能为写入而打开,就会抛出SQLiteException异常。

    public void onConfigure()

    在配置数据连接时会调用这个方法,确保预写日志或外键支持等功能可用。

    这个方法在onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int),onDowngrade(SQLiteDatabase, int, int)或onOpen(SQLiteDatabase)方法被调用之前被调用。除了配置必要的数据库连接之外,它不应该编辑数据库。

    这个方法只应该调用配置数据库连接参数的方法,如enableWriteAheadLogging(),setForeignKeyConstraintsEnabled(boolean),setLocale(Locale),setMaximumSize(long),或者执行PRAGMA语句。

    参数:

    db:被配置的数据库对象

    public abstract void onCreate(SQLiteDatabase db)

    数据库被首次创建时,会调用这个方法。这时创建数据库表和表初始化的地方。

    参数:

    db:要创建的数据库。

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

    当数据库需要被降级时,调用这个方法。这个方法与onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在当前版本比请求的版本新的时候,才会被调用。但是这个方法不是抽象的,因此它不是强制要求客户实现它的。如果这个方法没有被重写,默认的实现会拒绝降级处理,并抛出SQLiteException异常。

    这个方法是在事务中执行的。如果有异常被抛出,所有的改变都会被回滚。

    参数:

    db:指定要降级的数据库

    oldVersion:旧的数据库版本

    newVersion:新的数据库版本

    public void onOpen(SQLiteDatabase db)

    数据库被打开时,会调用这个方法。在升级数据库之前,这个方法的实现应该检查数据库是否是只读的(调用isReadOnly()方法)。

    数据库连接被配置且数据库策略被创建、升级或必要的降级之后,这个方法会被调用。如果数据库连接必须在策略被创建、升级或降级前做某些设置,那么就要在onConfigure(SQLiteDatabase)方法中来做这些事情。

    参数:

    db:被打开的数据库。

    public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    当数据库需要升级时,会调用这个方法。应该使用这个方法来实现删除表、添加表或者做一些需要升级新的策略版本的事情。

    SQLite ALTER TABLE的文档可以在以下网址中找到:

    http://sqlite.org/lang_altertable.html

    如果要给表添加一个新列,那么使用使用ALTER TABLE能够把新列插入到表中。如果要重命名或删除列,那么你能够使用ALTER TABLE能够重命名旧表,然后,创建一个新表,并把旧表中内容复制到新表中。

    这个方法是事务中执行的,如果有异常被抛出,所有的改变都会被自动的回滚。

    参数:

    db:指定要降级的数据库

    oldVersion:旧的数据库版本

    newVersion:新的数据库版本

    public void setWriteAheadLoggingEnabled(boolean enabled)

    启用或禁用数据库的预写日志。预写日志不能被用于只读的数据库,因此如果数据是以只读的方式被打开,这个标记值会被忽略。

    参数:

    enabled:true:启用预写日志,false:禁用预写日志

    参照:enableWriteAheadLogging()方法。

    http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging()

  • 相关阅读:
    Linux中的mv命令详解
    ASP.NET问题处理---targetFramwork=‘4.0’错误
    Android----二维码开发
    android--HttpURLConnection(转载)
    SQL server 跨库插入数据
    AndroidStudio中 R文件缺失的办法
    ASP.NET程序如何更新发布
    Android切换页面--setContentView
    Android----service
    Android开发必备:颜色选择
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4599569.html
Copyright © 2020-2023  润新知