Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLlite';没有此类列';仅在新安装时签名的APK中出错_Android_Sqlite_Android Sqlite - Fatal编程技术网

Android SQLlite';没有此类列';仅在新安装时签名的APK中出错

Android SQLlite';没有此类列';仅在新安装时签名的APK中出错,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我找到了问题的原因,请参见下文 简而言之,由于备份功能检索具有相同版本号的旧数据库方案,因此在我的SQLiteHelperClass中既没有调用onUpdate()也没有调用onCreate() 我遇到了一个我无法解决的奇怪问题。当我在模拟器中运行我的应用程序时,一切都正常。当我在手机上以apk-debug.apk的形式运行它时,一切正常,但当我尝试在手机上以已签名的应用程序的形式运行它时,会出现以下错误: Error Code : 1 (SQLITE_ERROR) Caused By : SQ

我找到了问题的原因,请参见下文

简而言之,由于备份功能检索具有相同版本号的旧数据库方案,因此在我的SQLiteHelperClass中既没有调用onUpdate()也没有调用onCreate()

我遇到了一个我无法解决的奇怪问题。当我在模拟器中运行我的应用程序时,一切都正常。当我在手机上以apk-debug.apk的形式运行它时,一切正常,但当我尝试在手机上以已签名的应用程序的形式运行它时,会出现以下错误:

Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(no such column: listId (code 1): , while compiling: SELECT * FROM mytable WHERE listId=100 ORDER BY id,name,conc ASC)
如果我在重新运行应用程序时删除了设置中的所有应用程序数据,那么所有内容都可以在已签名的应用程序版本中运行,尽管它最初是第一次安装在手机上

mytable是通过运行db.execSQL(DATABASE_CREATE_MY_TABLE)创建的:(列名是在别处设置的常量)

创建此错误的代码如下所示:

    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM " + MY_TABLE + " WHERE " + LIST_ID + "=?" + " ORDER BY " + NAME + "," + CONC + " ASC";
    Cursor cursor = db.rawQuery(selectQuery, new String[] {listId});
我的主要问题是列列表ID,它似乎不是在第一次安装签名的apk时创建的,但是如果我删除应用程序数据并重新运行签名的apk,它就会被创建。每次在emulator和手机上的dubug.apk上创建

我试过:

String selectQuery = "SELECT * FROM " + MY_TABLE + " WHERE " + LIST_ID + "=" + listId + " ORDER BY " + NAME + "," + CONC + " ASC";
Cursor cursor = db.rawQuery(selectQuery, null);
并对其进行了一些修改以进行调试:

String selectQuery = "SELECT * FROM " + MY_TABLE + " WHERE " + ID + "=?" + LIST_ID + "=?" + " ORDER BY " + NAME + "," + CONC + " ASC";
Cursor cursor = db.rawQuery(selectQuery, new String[] {id, listId});
结果是同样的错误。尝试了不同的列,但listId是在所有情况下导致错误的列。但只有在我的手机上运行签名的apk时。我的手机是三星S6,如果这意味着什么的话

作为一种调试措施,我尝试在我的应用程序使用此代码执行任何操作之前强制创建数据库

SQLiteDatabase db = this.getWriteableDatabase();
这表明数据库不是在第一次安装时创建的。实际上,尽管我卸载了数据库,但它似乎存在一个旧版本。因此,我增加了数据库版本,并在第一次安装时调用了onUpgrade()

第一次安装时,似乎没有正确创建已签名的apk数据库,或者没有使用卸载正确删除数据库


我似乎在我的代码或其他代码中找不到错误。在这里,我开始失明,但我希望其他人能看到错误,或者以前经历过类似的事情,并能将我推向正确的方向。

可能只是一个输入错误,但你已经看到了

mytable是通过运行db.execSQL(DATABASE\u CREATE\u MY\u TABLE)创建的


请注意,第一个变量

中的额外下划线可能只是一个输入错误,但您必须

mytable是通过运行db.execSQL(DATABASE\u CREATE\u MY\u TABLE)创建的


注意第一个变量中的额外下划线

我将在这里回答自己的问题

我创建了一个签名的apk,以便在我的手机上测试它,以及从以前的版本升级时它是如何工作的

在我的手机上,我还想尝试“干净”的安装、卸载和重新安装,看看它是如何工作的。然而,这导致了问题中描述的错误

原因是Android 6.0在manifest.xml中有allowBackup=true。这意味着卸载应用程序时,所有数据都将在重新安装应用程序时进行备份和检索。看


通常这是一件好事,但在调试我的应用程序时,我并没有考虑到这一点。此功能使我的应用程序跳过了onCreate()和onUpgrade(),因为备份的数据库版本与我尝试安装的应用程序中的版本相同,但经过一些修改。当我试图阅读onCreate()或onUpgrade()都没有创建的专栏时,我发现了错误。

我将在这里回答我自己的问题

我创建了一个签名的apk,以便在我的手机上测试它,以及从以前的版本升级时它是如何工作的

在我的手机上,我还想尝试“干净”的安装、卸载和重新安装,看看它是如何工作的。然而,这导致了问题中描述的错误

原因是Android 6.0在manifest.xml中有allowBackup=true。这意味着卸载应用程序时,所有数据都将在重新安装应用程序时进行备份和检索。看


通常这是一件好事,但在调试我的应用程序时,我并没有考虑到这一点。此功能使我的应用程序跳过了onCreate()和onUpgrade(),因为备份的数据库版本与我尝试安装的应用程序中的版本相同,但经过一些修改。当我试图阅读onCreate()或onUpgrade()都没有创建的列时,我得到了错误。

这是我问题中的类型,不是真正的代码!;-)但是,我的代码在emulator和apk-debug.apk构建中可以完美地工作,但在构建签名时就不行了……我的问题是这是一种类型,而不是真正的代码!;-)但是,我的代码在emulator和apk-debug.apk版本中运行良好,但在版本签名时无法运行……您是否已确保删除并重新安装了应用程序,以确保没有旧版本数据是问题的原因?是的,多次。一次又一次只有经过签名的构建才会起作用。从干净的安装开始记录每个sql create/select语句。在最坏的情况下,把这些线贴到错误处(如果可能的话)——也许有人能发现一些东西。找到了我问题的答案。正如我在问题中所说。看起来,当应用程序未安装时,数据库并没有被删除,而是当应用程序数据被删除时。默认情况下,在Android 6.0中,这个小东西被设置为true,Android:allowBackup=“true”,这实际上是在卸载时备份数据库,并在resintall上检索数据库!在android:allowBackup=“false”之后,它就可以工作了!哇!我花了很长时间才找到。我以为卸载应用程序会删除数据库。我不知道舱单上的这个标志阻止了这一切的发生。谢谢您是否已确保删除并重新安装了应用程序,以确保没有旧版本数据是问题的原因?是的,多次。一次又一次只有经过签名的构建才会起作用。从干净的安装开始记录每个sql create/select语句。在最坏的情况下,将这些行发布到错误中(如果可能的话)——也许是这样
SQLiteDatabase db = this.getWriteableDatabase();
private static final String DATABASE_CREATE_MYTABLE = "CREATE TABLE "
    + MY_TABLE + "("             
    + ID + " INTEGER, "
    + LIST_ID + " INTEGER, "
    + NAME + " STRING, "
    + CONC + " REAL, "
    + "PRIMARY KEY (" + ID + "," + LIST_ID + ")"
    + ")"