【问题标题】:App crashes when fetch questions from google firestore -Quiz app从 google firestore 获取问题时应用程序崩溃 - 测验应用程序
【发布时间】:2023-04-08 06:58:01
【问题描述】:

我为 Android 开发了一个测验应用程序。我使用 google firestore 来存储我的问题。我使用以下代码从 Firestore 中获取问题。在这段代码中,第一组问题很好地检索。但是当我打开另一个问题集合(“SET”)时,应用程序崩溃了。如何在不使应用程序崩溃的情况下获取集合。请帮忙。

    private void getQuestionList() {

        questionList.clear();
        firestore.collection("QUIZ").document("CAT" + String.valueOf(category_id)).collection("SET" + String.valueOf(setNo))
                .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {

                if (task.isSuccessful()){
                    QuerySnapshot questions = task.getResult();
                    for (QueryDocumentSnapshot doc : questions){
                        questionList.add(new Question(doc.getString("QUESTION"),
                                doc.getString("A"),
                                doc.getString("B"),
                                doc.getString("C"),
                                doc.getString("D"),
                                Integer.valueOf(doc.getString("ANSWER"))
                                ));
                    } setQuestion();
                }else {
                    Toast.makeText(QuestionsActivity.this,task.getException().getMessage(),Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

Firestore 数据库结构

Logcat 消息

07-30 13:22:51.835 28139-28139/com.supun.mcqapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.supun.mcqapp, PID: 28139
java.lang.RuntimeException: Field 'ANSWER' is not a java.lang.String
    at com.google.firebase.firestore.DocumentSnapshot.castTypedValue(DocumentSnapshot.java:499)
    at com.google.firebase.firestore.DocumentSnapshot.getTypedValue(DocumentSnapshot.java:491)
    at com.google.firebase.firestore.DocumentSnapshot.getString(DocumentSnapshot.java:361)
    at com.supun.mcqapp.QuestionsActivity$1.onComplete(QuestionsActivity.java:102)
    at com.google.android.gms.tasks.zzj.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:819)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:210)
    at android.app.ActivityThread.main(ActivityThread.java:5982)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)




07-30 13:22:51.985 2369-22884/? E/SQLiteDatabase: Error inserting source=16 tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG requires_charging=0 target_package=com.google.android.gms source_version=19831000 required_network_type=0 flex_time=2183000 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService runtime=1627631571923 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}} last_runtime=0 period=4368000 task_type=0 job_id=-1 user_id=0
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (Sqlite code 2067), (OS error - 2:No such file or directory)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:799)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1401)
    at aqnp.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):162)
    at aqne.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):163)
    at aqne.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):24)
    at aqne.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):156)
    at aqjx.run(:com.google.android.gms@19831020@19.8.31 (040406-284611645):8)
    at tfd.b(:com.google.android.gms@19831020@19.8.31 (040406-284611645):15)
    at tfd.run(:com.google.android.gms@19831020@19.8.31 (040406-284611645):10)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at tld.run(:com.google.android.gms@19831020@19.8.31 (040406-284611645))
    at java.lang.Thread.run(Thread.java:833)

07-30 13:22:51.990 2369-22884/? E/SQLiteDatabase: Error inserting source=16 tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG requires_charging=0 target_package=com.google.android.gms source_version=19831000 required_network_type=0 flex_time=2183000 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService runtime=1627631571960 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}} last_runtime=0 period=4368000 task_type=0 job_id=-1 user_id=0
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (Sqlite code 2067), (OS error - 2:No such file or directory)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:799)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1401)
    at aqnp.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):162)
    at aqne.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):163)
    at aqne.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):24)
    at aqne.a(:com.google.android.gms@19831020@19.8.31 (040406-284611645):156)
    at aqjx.run(:com.google.android.gms@19831020@19.8.31 (040406-284611645):8)
    at tfd.b(:com.google.android.gms@19831020@19.8.31 (040406-284611645):15)
    at tfd.run(:com.google.android.gms@19831020@19.8.31 (040406-284611645):11)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at tld.run(:com.google.android.gms@19831020@19.8.31 (040406-284611645))
    at java.lang.Thread.run(Thread.java:833)

夏天-logcat E/MultiWindowProxy: getServiceInstance failed!

【问题讨论】:

  • 分享你得到的错误日志
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。请回复@AlexMamo
  • @AlexMamo 我用 logcat 数据更新了问题。
  • 请同时向我们展示您的 QUESTION1 文档的内容,以便我们查看 A、B、C、D 字段。请回复@AlexMamo
  • 我只是解决问题。 Firestore 结构有问题。我输入了答案作为数字。当我将它转换为字符串时问题解决了。谢谢大家。

标签: java android firebase google-cloud-firestore


【解决方案1】:

在您的Firestore database 中,将字段“ANSWER”设置为String。我认为您将“ANSWER”的类型指定为Integer

还要确保检查所有字段中的spellings。有时它应该是错误的。因为我也遇到了这个错误。

【讨论】:

    【解决方案2】:

    问题出在Field 'ANSWER' is not a java.lang.String

    您需要在 for 循环中检查“ANSWER”的类型。 ANSWER 不是字符串,因此您无法尝试从 doc.getString("ANSWER") 获取它

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2017-01-27
      • 2015-01-14
      • 1970-01-01
      相关资源
      最近更新 更多