关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑

Android SQLiteOpenHelper 重复执行OnCreate()

说明:

       android中首次调用getWritableDatabase或getReadableDatabase执行OnCreate()方法,当数据库中不存在该表时执行创建操作

建议:

      建议创建表时在sql中添加判断语句 "CREATE TABLE IF NOT EXISTS  “

问题描述:

    1.数据库中相关表已经创建

    2.表中已经添加数据

    当查找表中总数的时候总是为空...

解决问题:

    1.跟踪log发现每次查询都会重新执行OnCreate()被执行并且sql中IF NOT EXISTS   无效,最后发现:

       getWritableDatabase执行了查询操作.

    



最近新加需求所以要添加一张表;逻辑和代码都按照以前能正常使用的写(就差没复制了),结果在运行的时候报了一个没有表的异常。纠结了很久,后来没办法理了下思路,表没创建成功,应该是没执行建表的语句,一打印log,果然是的。然后我手动调用onCreate(SQLiteDatabase db)居然就没出问题了。所以才有个这个onCreate(SQLiteDatabase db)调用时机的疑惑。


SQliteOpenHelper是一个辅助类,主要用来管理数据库的创建和版本的管理。说onCreate的使用时机,就不能孤立另外的2个方法:onUpgrade,onOpen.
参照sdk中的demo(记事本),大概是以下的使用场景:
onCreate(SQLiteDatabase):在数据库第一次生产的时候会调用这个方法,一般我们在这个方法里边生产数据库表。 
onUpgrade(SQLiteDatabase,int,int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据库表,并建立新的数据库表,当然是否还需要做其他的操作,完全取决于应用程序的需求。 
onOpen(SQLiteDatabase):这是当打开数据库时的回调函数,一般也不会用到。


这个很容易理解,在数据库第一次被创建时调用onCreate函数,参看帮助文档对这个函数的说明:Called when the database is created for the first time.也就是说在第一次创建数据库时调用,而数据库被创建出来后这个函数就没有用了,系统将不会再调用它,如果你想给数据库中加入一个表,那么可以使用onUPgrade函数,或者像你所做的那样,手动来调用onCreate函数。

-----------------******注******------------------------
注:实际情况中,我们总是通过一个类继承SQLiteOpenHelper来使用SQLite数据库,那么什么时候会调用onCreate函数呢?当我们产生这个类的对象的时候是不会调用onCreate函数的,只有第一次通过这个对象调用getReadableDatabase或者getWritableDatabase函数时才会调用onCreate函数,而如果调用过一次这个对象的getReadableDatabase或者getWritableDatabase函数后系统将不会再调用onCreate函数。


你们说的和我以前想的都没错,刚才我验证了:onCreate(SQLiteDatabase db)方法当且仅当数据库第一次创建的时候执行。如果想在已有的数据库上新增一张新表,只在onCreate(SQLiteDatabase db)方法中增加一条sql语句和修改版本号是不够的,还要在onUpgrade()函数中在调用一次OnCreate()函数。

   
  
  
  1. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  2.         // TODO Auto-generated method stub
  3.         try {
  4.             db.execSQL("drop table if exists "+mTableName);
  5.             onCreate(db);
  6.         } catch (SQLException e) {
  7.             e.printStackTrace();
  8.         }
  9.     }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值