zoukankan      html  css  js  c++  java
  • android数据库创建,升级,降级什么时候执行

    最近做应用,遇到一个有关android数据库的问题,一直是建一个表占一个数据库,虽然看着好找,可发现既麻烦还代码多,于是查找有什么优化的方法,了解到数据库的创建,升级,降级什么时候执行的问题:

    SQLiteOpenHelper里的onCreate执行:

    1.只在数据库还没有建立时运行一次.如果数据库已经存在了,就不再执行onCreate方法,即在第一次打开数据库的时候才会执行

    2.在清除数据之后再次运行-->打开数据库,这个方法会执行

    3.没有清除数据,不会执行这个方法

    4.数据库升级的时候这个方法不会执行,想执行需要先删除数据,再调用onCreate方法

    onCreate里可以建多张表,并为每张表插入数据,为此解决了我原先一张表一个数据库的繁琐。

    部分代码如下:

     1      StringBuilder sbCategory1 = new StringBuilder();
     2         sbCategory1.append("create table if not exists ");
     3         sbCategory1.append(NEWS_CATEGORY_TBL_COUNTRYS);
     4         sbCategory1.append("(");
     5         sbCategory1.append(NEWS_CATEGORY_TBL_COUNTRYID).append(" Integer primary key autoincrement,");
     6         sbCategory1.append(NEWS_CATEGORY_TBL_COUNTRYNAME).append(" varchar(20)");
     7         sbCategory1.append(")");
     8         
     9         db.execSQL(sbCategory1.toString());
    10         
    11         //在库中插入默认数据
    12         List<Countrys> countryList = AreaManagerDao.getCountrysList();
    13                 for(Countrys item : countryList){
    14                     ContentValues values = new ContentValues();
    15                     values.put(NEWS_CATEGORY_TBL_COUNTRYID, item.getCountryId());
    16                     values.put(NEWS_CATEGORY_TBL_COUNTRYNAME, item.getCountryName());
    17                     db.insert(NEWS_CATEGORY_TBL_COUNTRYS, null, values);
    18                 }
    19         //********************************
    20         StringBuilder sbCategory2 = new StringBuilder();
    21         sbCategory2.append("create table if not exists ");
    22         sbCategory2.append(NEWS_CATEGORY_TBL_PROVINCES);
    23         sbCategory2.append("(");
    24         sbCategory2.append(NEWS_CATEGORY_TBL_PROVINCEID).append(" Integer primary key autoincrement,");
    25         sbCategory2.append(NEWS_CATEGORY_TBL_COUNTRYID).append(" Integer,");
    26         sbCategory2.append(NEWS_CATEGORY_TBL_PROVINCENAME).append(" varchar(20)");
    27         sbCategory2.append(")");
    28         
    29         db.execSQL(sbCategory2.toString());
    30         
    31         //在库中插入默认数据
    32         List<Provinces> provincesList = AreaManagerDao.getProvincesList();
    33                 for(Provinces item : provincesList){
    34                     ContentValues values = new ContentValues();
    35                     values.put(NEWS_CATEGORY_TBL_PROVINCEID, item.getProvinceId());
    36                     values.put(NEWS_CATEGORY_TBL_COUNTRYID, item.getCountryId());
    37                     values.put(NEWS_CATEGORY_TBL_PROVINCENAME, item.getProvinceName());
    38                     db.insert(NEWS_CATEGORY_TBL_PROVINCES, null, values);
    39                 }

    onUpgrade的执行:

    1.第一次创建数据库的时候,这个方法不会执行

    2.清除数据后再次运行(相当于第一次创建)这个方法不会执行

    3.数据库已经存在,而且版本升高的时候,这个方法才会调用,但不会自动执行onCreate

    代码如下:

     1 /**
     2        * onUpgrade当版本号不一致时,执行
     3        */
     4     @Override
     5     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
     6           db.execSQL( "DROP TABLE IF EXISTS " + NEWS_CATEGORY_TBL_GUODOURECIPE );
     7           db.execSQL( "DROP TABLE IF EXISTS " + NEWS_CATEGORY_TBL_COUNTRYS );
     8           db.execSQL( "DROP TABLE IF EXISTS " + NEWS_CATEGORY_TBL_PROVINCES );
     9           db.execSQL( "DROP TABLE IF EXISTS " + NEWS_CATEGORY_TBL_CITYS );
    10           onCreate(db);        
    11     }

    onDowngrade的执行:

    1.执行数据库的降级操作
    2.只有新版本比旧版本低的时候才会执行
    3.如果不执行降级操作,会抛出异常
    
    
    
    
    
    



  • 相关阅读:
    MYBATIS 的parameter
    深入了解MyBatis参数
    js之onload事件的一点使用心得
    js中document.write的那点事
    MyBatis直接执行SQL查询及批量插入数据
    ng 服务
    ng json格式的序列化和反序列化
    ng 自定义过滤器的创建和使用
    ng 过滤器
    ng 双向数据绑定 实现 注册协议效果
  • 原文地址:https://www.cnblogs.com/jiuqing/p/4046033.html
Copyright © 2011-2022 走看看