关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
来源:互联网 发布:淘宝小号淘气值查看 编辑:程序博客网 时间:2024/05/31 19:40
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()函数。
<ol class="linenums" style="list-style-position: outside; margin: 0px; padding: 0px 0px 0px 10px; border: none;"><li class="L0" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="kwd" style="color: rgb(0, 0, 139); font-weight: bold;">public</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 139); font-weight: bold;">void</span><span class="pln" style="color: rgb(0, 0, 0);"> onUpgrade</span><span class="pun" style="color: rgb(0, 0, 0);">(</span><span class="typ" style="color: rgb(43, 145, 175); font-weight: bold;">SQLiteDatabase</span><span class="pln" style="color: rgb(0, 0, 0);"> db</span><span class="pun" style="color: rgb(0, 0, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 139); font-weight: bold;">int</span><span class="pln" style="color: rgb(0, 0, 0);"> oldVersion</span><span class="pun" style="color: rgb(0, 0, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 139); font-weight: bold;">int</span><span class="pln" style="color: rgb(0, 0, 0);"> newVersion</span><span class="pun" style="color: rgb(0, 0, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L1" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="com" style="color: gray;">// TODO Auto-generated method stub</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L2" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 139); font-weight: bold;">try</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L3" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> db</span><span class="pun" style="color: rgb(0, 0, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">execSQL</span><span class="pun" style="color: rgb(0, 0, 0);">(</span><span class="str" style="color: maroon;">"drop table if exists "</span><span class="pun" style="color: rgb(0, 0, 0);">+</span><span class="pln" style="color: rgb(0, 0, 0);">mTableName</span><span class="pun" style="color: rgb(0, 0, 0);">);</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L4" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> onCreate</span><span class="pun" style="color: rgb(0, 0, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">db</span><span class="pun" style="color: rgb(0, 0, 0);">);</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L5" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 139); font-weight: bold;">catch</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">(</span><span class="typ" style="color: rgb(43, 145, 175); font-weight: bold;">SQLException</span><span class="pln" style="color: rgb(0, 0, 0);"> e</span><span class="pun" style="color: rgb(0, 0, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L6" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> e</span><span class="pun" style="color: rgb(0, 0, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">printStackTrace</span><span class="pun" style="color: rgb(0, 0, 0);">();</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L7" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);"></span></li><li class="L8" style="list-style: decimal; margin: 0px; padding: 0px 0px 0px 10px; border: none; line-height: 20px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(0, 0, 0);">}</span></li></ol>
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- [android]关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机
- SQLiteOpenHelper调用onCreate函数的时机
- 关于SQLiteOpenHelper类的onCreate方法
- SQLiteOpenHelper类的onCreate方法什么时候被执行--只有database.db不存在的时候
- AppConext 的onCreate方法执行时机
- SQLiteDatabase和SQLiteOpenHelper的不同
- Context与SQLiteDatabase的方法openOrCreateDatabase的区别 (context、SQLiteOpenHelper)
- Context与SQLiteDatabase的方法openOrCreateDatabase的区别 (context、SQLiteOpenHelper)
- sqliteopenhelper继承类的oncreate函数调用时间
- 关于Activity的onNewIntent方法调用时机
- 关于Activity onNewIntent方法的调用时机
- SQLiteOpenHelper类的onCreate方法什么时候被执行
- SQLiteOpenHelper类的onCreate方法什么时候被执行
- Android SQLiteDatabase帮助类SQLiteOpenHelper的使用
- SQLiteOpenHelper CLASS,与SQLiteDataBase CLASS的使用
- 简述RFID系统的时隙ALOHA算法的工作过程
- android开发使用greenDAO如何自动生成代码
- RFID系统二进制属性搜索算法是如何解决碰撞的?简述其实现步骤
- Mysql数据库相关一些知识整理
- 4,17建立对象数组,存放6个学生数据,指针指向数组首个元素,输出2,4,6个学生数据
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- 【黄斤德】午夜评:4月22现货黄金、现货白银午夜操作策略
- Android 入门 -- AsyncTask
- NSSet和NSArray转化
- NS3实例分析(1)-- hello-simulator.cc
- 返回值的运用
- MVVM Tutorial with ReactiveCocoa: Part 1/2
- Nodejs express操作cookie和session
- How Many Tables