【问题标题】:Why would SQLiteOpenHelper.onUpgrade fail?为什么 SQLiteOpenHelper.onUpgrade 会失败?
【发布时间】:2010-09-13 07:24:09
【问题描述】:

嗨(这是我在 StackOverflow 上的第一篇文章:),

每次我增加我的数据库版本并将升级后的应用程序推送到 用户,发生了一些奇怪的事情。对于某些人来说,它工作得很好, 和一些报告崩溃(包括通过市场的报告 系统)由于缺少我刚刚在 onUpgrade 中添加的表列引起的。

如果要查看方法: http://code.google.com/p/tag-todo-list/source/browse/trunk/Donut/src/com/android/todo/data/ToDoDB.java#136

我无法发现 onUpgrade 中出现的任何异常。我是什么 目前绕过这些问题的做法是拦截 首次调用新字段的异常和 然后“手动”调用 onUpgrade,这有点脏。

此外,应用程序有时会在访问主表时生成“没有这样的表”SQLiteException(同样,仅针对某些用户),这非常奇怪……有人知道为什么会发生这些事情吗?或者你能发现我的代码有问题吗?

谢谢, 特奥

【问题讨论】:

    标签: android exception sqlite


    【解决方案1】:

    我没有深入阅读您的代码,但您是否在添加列时为记录播种了值?我可以看到您在其中放置了一个默认值,但是当您第一次将新列添加到现有表中时,表中现有记录的列字段会发生什么?

    我在版本升级时也有类似的问题,但通过执行db.exec("UPDATE... 函数调用,我可以将默认值植入所有现有记录中。这修复了很多“X 列不存在”等错误。

    【讨论】:

    • 您好,感谢您的回答,我想这可能是一个很好的做法,并且从现在开始会这样做,更新的事情。任何结果都可能需要一些时间和我的应用程序的一些新版本才能显示:) 我认为这不是问题,我认为当我在光标中包含相应的列时会出现例外情况。而那些“没有这样的表”的例外,只针对某些人......无论如何都不应该发生......我想我会研究一些官方开源应用程序并看看他们对数据库版本控制做了什么,表创作等等,如果我发现了什么,我会把它贴在这里让其他人找到
    • 当我将它们包含在光标中时,我得到了这些异常。只有在对数据进行操作(从数据库读取或写入)时,您才会注意到它们。您使用什么系统来开发您的应用程序?我很惊讶如果你不这样做,你在测试时不会弹出异常,特别是如果你有 not null 的数据。此外,回馈社区但给予信任总是很好的。打勾。
    • 我正在使用标准模拟器,在我的手机和大多数用户手机上都没有错误......唯一的问题是这些事情仍然发生在相当多的用户身上,我不能找出原因。 “没有这样的桌子”异常特别烦人,因为我无法绕过它:/
    • 会不会是较早(或较晚?)版本的 SDK 给您带来问题?您的应用是否需要特定版本和/或您是否尝试在早期版本的 Android 上运行您的应用?
    • 构建目标是 Android 1.6 和 android:minSdkVersion="4"。从理论上讲,它应该在 >= 1.6 的任何设备上运行(我在自己的手机上使用 2.2,它可以完美运行)。更奇怪的是,我有 2 个表,其中一些缺少,而另一些缺少,这就像它们的创建以某种方式失败,在 onCreate 中没有异常,但它们首先是通过 SQL 访问的。
    猜你喜欢
    • 2016-04-11
    • 2021-10-10
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多