【问题标题】:Internal error in Firestore (0.6.6-dev) when trying to update document尝试更新文档时 Firestore (0.6.6-dev) 出现内部错误
【发布时间】:2018-03-22 10:27:36
【问题描述】:

以下错误让我很难受。我正在尝试更新存储在 Firestore 项目中的文档中的单个字段。

    E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Internal error in Firestore (0.6.6-dev).
  at com.google.android.gms.internal.zzejs.run(Unknown Source)
  at android.os.Handler.handleCallback(Handler.java:725)
  at android.os.Handler.dispatchMessage(Handler.java:92)
  at android.os.Looper.loop(Looper.java:176)
  at android.app.ActivityThread.main(ActivityThread.java:5365)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
  at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction.
  at android.database.sqlite.SQLiteSession.throwIfNoTransaction(SQLiteSession.java:926)
  at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:398)
  at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:524)
  at com.google.android.gms.internal.zzefi.zzb(Unknown Source)
  at com.google.android.gms.internal.zzedu.zzcao(Unknown Source)
  at com.google.android.gms.internal.zzedu.start(Unknown Source)
  at com.google.android.gms.internal.zzeca.zza(Unknown Source)
  at com.google.android.gms.internal.zzecc.run(Unknown Source)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153)
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
  at com.google.android.gms.internal.zzejp$zza.run(Unknown Source)
  at java.lang.Thread.run(Thread.java:856)

这是我的代码:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

if(user == null){
    Log.e(LOGTAG, "Could not upload because user is not logged in.");
    return;
}

FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference userRef = db.collection("users").document(user.getUid());

TextInputEditText textview = findViewById(R.id.edit_text_foo);
String enteredText = textview.getText().toString(); //implements CharSequence, thus toString() gives the correct string
userRef.update("field_foo", enteredText)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.i(LOGTAG, "Text successfully updated!");
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "Error updating text", e);
            }
        });

每次执行该方法时都会发生错误。恕我直言,“内部错误”短语可能表明这确实是 Firestore 数据库早期 beta 状态出现的问题。然而,这是我的第一个 android 应用程序,我也是 Firebase 的新手。任何合格的估值,任何解决方案的想法或任何指针?

【问题讨论】:

  • 丹这似乎不是你所做的任何事情的错。您可以尝试清除您应用的数据,然后重试吗?
  • 我刚刚意识到 - 您要更新的文档是否存在?如果不能,您可以尝试使用 set() 调用吗?在任何一种情况下,我都不希望有内部断言,但我想缩小原因。

标签: android google-cloud-firestore


【解决方案1】:

感谢@hatboysam,它现在可以工作了。 解决方案非常简单:

清除设备应用管理器中的数据。

然后再次运行应用程序。

【讨论】:

  • 对于其他阅读本文的人来说,SQLite 数据库似乎以某种方式损坏了。如果其他人可以复制此内容,请与我联系。
  • 清除应用程序管理器中的数据对于真实客户来说不是一个可行的选择。我们如何以编程方式解决此问题?
  • 在尝试执行一些需要 100% 互联网的操作(例如事务)后,SQLite 可能会损坏。如果您尝试在没有互联网的情况下进行交易,应用程序将永远保持循环。连同数据库上的“请求”。控制它以避免这个问题
  • 嘿@SamStern,我多次遇到这个异常。我将 Firestore 添加到应用程序,与 Firestore 相关的功能只是在 2 个集合(用户和用户数据)中的 2 个 uuid 文档上获取/设置,并且只添加一个实时侦听器。然后通过数据和 wifi 连接到互联网,打开应用程序 -> 将其置于后台 -> 等待 10 - 15 分钟 -> 断开 wifi => 发生异常
【解决方案2】:

当您在多个进程中多次初始化 Firestore 对象时会出现此问题。所以不要一次又一次地声明它,而是全局声明它并相应地使用..

【讨论】:

  • 如果您尝试从多个进程使用 Firestore,它应该会给您一个错误(说“无法获得对 Firestore 客户端离线持久性的独占锁定。这通常意味着您在多个进程中使用 Firestore你的应用程序...”)。如果您看到不同的东西,请告诉我(最好提供示例代码)?
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 2018-11-17
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2019-05-25
相关资源
最近更新 更多