SqliteOpenHelper的onUpgrade()死活不运行的解法
自己的机器 android 2.3,刷的小米系统,曾经执行成功过一次,前后传的版本号也正确,后来死活不执行,确实是调用的getWritableDatabase(),看了Android源码,也没发现异常。
百思不得其解!换了公司的一台测试机,又可以。
由此暂时断定这个onUpgrade不靠谱,自己写了一套升级sqlite数据库的逻辑。
在assets下做一个update.sql文件,然后读取文件,一行行的执行sql;若升级成功,在库里面写个标记。
注意:update.sql里面,一个完整的操作,其包含的句子需要合并成一行。
代码如下(只是思路,不可直接copy使用):
private void updateDB() { SqliteHelper sqliteHelper = SqliteHelper.getInstance(this); if (!("" + Config.SQLITE_DB_VERSION) .equals(sqliteHelper.getValue(Configuration.DB_VERSION))) { LogUtil.i(TAG, "=====数据库升级开始====="); // sqliteHelper.beginTransaction(); try { InputStream in = this.getAssets().open("update.sql"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); String tmpStr = null; StringBuffer sql = new StringBuffer(); while ((tmpStr = bufferedReader.readLine()) != null) { sql.append(tmpStr); sql.append("\n"); if (tmpStr.trim().endsWith(";")) { sqliteHelper.execSQL(sql.toString()); sql = new StringBuffer(); } } bufferedReader.close(); in.close(); // sqliteHelper.setTransactionSuccessful(); sqliteHelper.setValue(Configuration.DB_VERSION, "" + Config.SQLITE_DB_VERSION); LogUtil.i(TAG, "=====数据库升级成功!====="); } catch (Exception e) { LogUtil.e(TAG, e.getMessage()); } finally { // sqliteHelper.endTransaction(); } } }
本博客所有随笔,若未明确标示为转载或未带有原文链接,皆为原创。
本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
- 出处:http://kaima.cnblogs.com
- 作者:kai.ma
分类:
Android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述