在应用程序中给sqlite创建表的时候,一般是在onCreate语句中创建一个表,然后编译程序。但今天发现了一个有趣的问题,就是android的创建一个表以后,再创建一个表时编译运行,会提示新创建的表不存在no such table,很郁闷搞了很久,通过把原来的程序卸载掉,再重新装上去可以解决问题。但是如果让用户使用需要升级的时候,总不能叫用户卸载了以后再安装软件吧。
研究许久,发现自己并没有注意sqlite中有一个version,还有一个onUpgrade(>_<不要为了用而学,要学而用啊)。原来挺简单,只要在下一次改变数据库的时候,修改version的值,然后在onUpgrade加入建表语句就可以了。比如用户第一次安装软件的时候version为1,那创建数据库的时候会调用onCreate方法,后来你改变了功能,加入了新的表,并把version改为了2,那么用户下次安装的时候,因为数据库已经存在了,而且它会检查到version已经改变,用户打开软件第一次使用数据库的时候就不会再调用onCreate方法了,只会调用onUpgrade方法!
也就是说,onCreate方法在软件中只会被调用一次(卸载了重装除外),onUpgrade则完全取决于version,version改变便会调用一次,这就是为什么要有onUpgrade的原因,主要是新老用户的数据库可能不一致,写程序时onCreate中一直是包含所有的建表语句,onUpgrade则是保存记录每一次版本变更做出的修改。