Android应用程序仅在从Playstore更新后崩溃

时间:2017-03-25 14:37:36

标签: android sqlite proguard android-contentprovider android-proguard

我最近使用版本1.2更新了My Application,因为我使用内置数据库来显示数据。我首次从资产中复制了数据库,并使用 ContentProvider 来访问数据库中的数据。

首次安装时工作正常但如果任何用户从Playstore更新应用程序时会收到错误。

用户报告的

错误记录

报告1:

android.database.sqlite.SQLiteException: no such column: utp (code 1): , while compiling: UPDATE quotes SET liked=?,utp=? WHERE _id=1183
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1574)
    at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1522)
    at com.emergingcoders.database.QuoteContentProvider.update(Unknown Source)
    at android.content.ContentProvider$Transport.update(ContentProvider.java:355)
    at android.content.ContentResolver.update(ContentResolver.java:1360)
    at com.emergingcoders.a.c$a.onClick(Unknown Source)
    at android.view.View.performClick(View.java:5201)
    at android.view.View$PerformClick.run(View.java:21163)
    at android.os.Handler.handleCallback(Handler.java:746)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5443)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

报告2(参加同样的活动):

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.support.v4.content.o$3.done(Unknown Source)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
Caused by: android.database.sqlite.SQLiteException: no such column: utp (code 1): , while compiling: SELECT * FROM quotes WHERE (liked=1) ORDER BY utp DESC
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
    at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400)
    at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294)
    at com.emergingcoders.database.QuoteContentProvider.query(Unknown Source)
    at android.content.ContentProvider.query(ContentProvider.java:1017)
    at android.content.ContentProvider$Transport.query(ContentProvider.java:238)
    at android.content.ContentResolver.query(ContentResolver.java:491)
    at android.support.v4.content.c.a(Unknown Source)
    at android.support.v4.content.b$c.a(Unknown Source)
    at android.support.v4.content.b.a(Unknown Source)
    at android.support.v4.content.k.h(Unknown Source)
    at android.support.v4.content.k.d(Unknown Source)
    at android.support.v4.content.a.e(Unknown Source)
    at android.support.v4.content.a$a.a(Unknown Source)
    at android.support.v4.content.a$a.a(Unknown Source)
    at android.support.v4.content.o$2.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    ... 3 more

报告3:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mrapps.statusandquotes/com.emergingcoders.activities.TodaysQuotesActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5443)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.database.CursorWindow.nativeGetString(Native Method)
    at android.database.CursorWindow.getString(CursorWindow.java:438)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    at android.database.CursorWrapper.getString(CursorWrapper.java:137)
    at com.emergingcoders.activities.TodaysQuotesActivity.onCreate(Unknown Source)
    at android.app.Activity.performCreate(Activity.java:6245)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
    ... 9 more

proguard-rules.pro:

-keep public class android.support.v7.widget.** { *; }
-keep public class android.support.v7.internal.widget.** { *; }
-keep public class android.support.v7.internal.view.menu.** { *; }

-keep public class * extends android.support.v4.view.ActionProvider {
    public <init>(android.content.Context);
}

-keep public class * extends android.support.v7.widget.RecyclerView$LayoutManager {
    public <init>(...);
}

-keep class android.support.v7.widget.RoundRectDrawable { *; }

# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

-keep class uk.co.chrisjenx.calligraphy.* { *; }
-keep class uk.co.chrisjenx.calligraphy.*$* { *; }

-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.**
-dontwarn org.ietf.jgss.**

# Only necessary if you downloaded the SDK jar directly instead of from maven.
-keep class com.shaded.fasterxml.jackson.** { *; }

-dontwarn okio.**
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

-keep class com.emergingcoders.model.** { *; }

-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

我没有在新的更新中更新数据库版本,我尝试了很多但是不知道为什么它只在更新应用程序后发生。

任何人都可以提供帮助?提前谢谢。

1 个答案:

答案 0 :(得分:2)

我认为您没有为数据库提供正确的更新脚本。如果应用程序是从头开始运行(即没有现有的数据库),这将正常工作(因为不需要数据库迁移)

研究SQLHelper类,它提供了允许您迁移数据库版本的方法。

要明确的是,您需要更新数据库架构,而不是数据(架构中缺少一列,错误说明了这一点):

no such column: utp