【发布时间】: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名称。当模拟器未连接时,这通常会失败,因此如果失败则重新启动。它会擦除模拟器或连接设备中指定应用程序的所有数据,你应该没问题。 -
刚刚尝试禁用即时运行,没有用...