【问题标题】:Android Studio "uploads" old version of SQLite tables inside my app whenever I run每当我运行时,Android Studio 都会在我的应用程序中“上传”旧版本的 SQLite 表
【发布时间】:2017-05-05 19:54:39
【问题描述】:

我在开发我的第一个应用程序时遇到了一个主要障碍,我无法理解到底出了什么问题。我已经在一个应用程序中实现了提供程序和多个表,该应用程序基本上会在其内部交叉引用表。出于某种原因,即使在我的手机上删除了应用程序的数据并卸载它之后,一旦我从 Android Studio 运行应用程序,它也会“重新上传”我在应用程序中输入的一些模拟数据以测试功能。

我认为这会阻止我正确添加我需要的表(我已经尝试过但没有成功),因为我无法为 SQLite 获得“明确的开始”......每当我遇到崩溃时为我在第一次运行后添加的任何新表调用数据库助手和内容提供程序(每当我调用游标时)(哪个版本包含在应用程序中神奇地重新出现的数据)...

* 更新 *

在 AndroidManifest 中禁用 Google 的自动备份功能,并在禁用设备互联网连接的情况下运行应用程序(卸载后)会处理“幽灵”数据。但是,现在我可以看到 Android Studio 也正在认真执行,因为被注释掉的代码块正在“正常”执行。如果我不确定我看到的是我正在调试的内容,那么进一步编程就没有意义了,因此我完全没有办法告诉我的数据库是如何/是否按应有的方式构建的......问题与下面的“经理”仍然存在。

这是我的日志:

FATAL EXCEPTION: main
   Process: com.scolfaro.multiscreenwallet10, PID: 10461
   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.scolfaro.multiscreenwallet10/com.scolfaro.multiscreenwallet10.CreditManagerActivity}: java.lang.NumberFormatException: For input string: "managers"
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
       at android.app.ActivityThread.-wrap12(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6126)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    Caused by: java.lang.NumberFormatException: For input string: "managers"
       at java.lang.Long.parseLong(Long.java:443)
       at java.lang.Long.parseLong(Long.java:485)
       at android.content.ContentUris.parseId(ContentUris.java:86)
       at com.scolfaro.multiscreenwallet10.data.WalletProvider.query(WalletProvider.java:269)

这是我的合同类:

public final class CreditManagerContract {

private CreditManagerContract(){}

public static final String CONTENT_AUTHORITY = "com.scolfaro.multiscreenwallet10";

public static final Uri BASE_CONTENT = Uri.parse("content://" + CONTENT_AUTHORITY);

public static final String PATH_MANAGERS = "managers";

public static abstract class CreditManagerEntry implements BaseColumns {

    public static final String CONTENT_LIST_TYPE =
            ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY
                    + "/" + PATH_MANAGERS;

    public static final String CONTENT_ITEM_TYPE =
            ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY
                    + "/" + PATH_MANAGERS;

    public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT, PATH_MANAGERS);

    public static final String TABLE_NAME = "managers";

    public static final String _ID = BaseColumns._ID;
    public static final String COLUMN_TAG = "tag";
    public static final String COLUMN_CLOSE_DATE = "closedate";
    public static final String COLUMN_DUE_DATE = "duedate";

这种情况一直在发生,所以我发布了代码中导致异常的所有行。这是实际抛出它的那一行:

selectionArgs = new String[] {String.valueOf(ContentUris.parseId(uri))};

这是它指向的第二行(在另一个类中):

Cursor cursor = context.getContentResolver().query(

这是调用第二行的地方(并导致活动崩溃):

ArrayList<CreditManager> entries = DbLoader.loadCreditManager(this);

【问题讨论】:

  • 我假设您在 SQLite 类的 onCreate 方法中插入该数据?
  • 如果您没有对数据进行硬编码,请尝试禁用即时运行或清理构建并再次运行。
  • 是的,我是……我已经一次编写了一半的功能(大约 4-5 张桌子),然后计划了其余的,尝试擦除所有内容并添加了其余的……每个调用任何新表都会导致崩溃,而旧表(即使是空表)仍然可以工作......我通过我的 DbHelper 阅读了很长时间,以至于我越来越沮丧 ATM XD 这一切似乎都是正确的,不是虽然工作......
  • 尝试从工作室本身卸载整个应用数据。转到主要menu/Run/Edit Configuration。选择左侧`Android Application`下的app。选择General标签,点击底部绿色+sing会出现一个下拉菜单,选择`Gradle-aware-make`选项。将弹出另一个文本框。在此文本框中输入`:app:uninstallAll`。其中“app”是您的app-module 名称。当模拟器未连接时,这通常会失败,因此如果失败则重新启动。它会擦除模拟器或连接设备中指定应用程序的所有数据,你应该没问题。
  • 刚刚尝试禁用即时运行,没有用...

标签: android android-sqlite


【解决方案1】:

感谢所有做出贡献的人(在此过程中帮助我学习如何浏览我们这里拥有的宝贵资源)。

所以,如果您遇到此类问题(“幽灵”数据返回查看),请断开您的测试设备与互联网的连接,因为 Google 默认在应用程序中使用“自动备份”。当您在更新/开发数据库方案时发生这种情况是非常有害的(它会导致非常令人费解的崩溃,因为在第一次实现 DBHelper 后无法添加表)。

然后,转到您的 AndroidManifest 并查找启用自动备份的密钥,然后将其禁用!

最后,对于此处粘贴的异常,我的菜鸟自己忘记在 UriMatcher 的开关上添加一个“中断”,这会立即导致“默认:抛出异常”的情况,因为没有中断匹配器.生活和学习...

我花了整个下午将我的合同、DbHelper 和提供程序与 Google 的 ContactProvider/Contract/Helper 进行比较,学到了很多东西,并且在通过切换器并再次记录后发现了我的初学者错误......继续优化我的数据方案现在是菜鸟非标准化的混乱(在“学习”良好的数据库实践以及它们与我的第一次学习经验有何不同之后)......

谢谢大家!我希望其他人能从我的学习曲线中获益......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多