在网上找了大把大把的资料、还是没能怎么弄清楚关于SQLite升级。固把一些网上找到的资料跟自己摸索出来的东西一起发出来。望有厉害的前辈能够指点一二。
先上网上一些高手的资料:http://blog.sina.com.cn/s/blog_6400e5c50101mgu4.html 、http://blog.csdn.net/yaya_soft/article/details/17089353 、 http://www.iteye.com/topic/1127838。
其中我所在的情况跟第三位前辈所遇到的情况一样, 先说Android SQLite吧, Android系统本身自带了一个建立SQLite的工具SQLiteOpenHelper、我们只要继承它,里面有几个重写的方法。
为了方便快捷、我只列出了onCreate方法跟onUpgrade方法。 onCreate方法是我们第一次创建数据库的时候会调用,onUpgrade()是我们数据库版本号不一样的时候会调用。网上很多资料都说如果要进行数据库升级,那就直接在onUpgrade里面写你所需要的进行的操作。比如:
至于里面代码具体的作用可以参照上面第一 第二个链接,里面有详细解释。
本人的情况是:本人使用外带的可视化工具直接把数据库跟表都已经建立好了,直接复制在raw目录下面。就没有通过系统自带的方法来建立数据库跟表。于是网上找资料一直不明白他们所谓的 在onUpgrade里面进行升级。 因为本人代码压根就没onUpgrade方法可以使用。 完了在网上找到各种资料、最终明白:无论你是用系统自带的SQLiteOpenHelper工具建立数据库跟表、还是使用外带工具。如果你要进行数据库升级。你所需要的操作都是一样的。只是系统自带的里面有onUpgrade()方法直接调用。而用外带工具的话你肯定也有一个自己写的SQLite操作类、只是使用自己写的操作类的话、onUpgrade()方法也是我们自己写。 反正里面要进行的操作都是一样的。
现在就看看如何进行数据库升级。
关于这块代码、如果你使用自己写的SQLite操作类,那你一看就明白。我们只需要得到db对象。就可以使用 db.execSQL("ALTER TABLE Subscription ADD COLUMN Activation BLOB"); 这个和SQLiteOpenHelper里面onUpgrade()方法里面的操作是一样的;同样是升级数据库的操作。
接下来就说说怎么判断数据库需要升级、这个就是涉及到版本匹配了、
再看这块代码、我们只要拿到db对象、就可以拿到db对应的版本、同时也可以更新db 的版本。完了我们可以参照上面链接中第三位前辈的方法、把我们最新的数据库版本定义在versionCode在AndroidManifest.xml文件中。 这样你最新数据库版本跟以前数据库版本都有了 、就可以判断更新不更新。这里解释下关于外带数据库的一些事情: 外带数据即我们通过sqlite expert professional可视化 工具建立一个sqlite.db文件、同时把文件放在raw目录下、我们每次进行数据库操作的时候就会先把raw目录下的sqlite.db复制到手机里面的路径下(如果手机路径里面存在sqlite.db就不复制)、完了以后每次取数据库都是从手机路径里面取的。如果我们raw目录下的sqlite.db进行了更新(我们自己把数据表改下、直接替换 ).同时我们的apk版本进行升级更新的时候覆盖安装apk。我们手机目录下的sqlite.db是不会更新的,还是旧版本。 但是我们raw目录下的sqlite.db是新版本。这个时候也不会再复制到手机。 这就需要我们把手机目录下的sqlite.db替换成raw目录下的。 写到这里我又想起一个事情:以前有位同事问为什么要把raw目录下的sqlite.db复制到手机、然后又操作手机路径下的sqlite.db 这不是多此一举吗。他说可以把sqlite.db放在assets目录下、不复制到手机路径。直接就是操作assets目录下的sqlite.db,这样每次数据库更新就直接替换assets目录下的sqlite.db。 我不知道放在assets目录下的好处、同时也不知道放在raw 然后复制到手机路径的好处。 这些我都不知道(望高人指点), 我只知道反正就是不能直接替换salite.db , 直接替换的话就是把旧版本的sqlite.db删除、再安装新版本的sqlite.db。
如果这样操作的话好像以前的数据都会丢失、就好像卸载重装一样。 无论何种方式我们要想保留数据都要进行数据的转移。关于数据转移前面给的链接中有。这里就不多讨论了。 发这篇文章只是自己搞这块的时候,一直被网上说的在onUpgrade()方法中直接更新搞糊涂了。 在这里记下来、免得下次不记得。
嗯 就这样子吧、 第一次写文章 、写得不好、主要是为了自己记一下。