最近做应用,遇到一个有关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.如果不执行降级操作,会抛出异常