gpt4 book ai didi

Android Firestore : Failed to gain exclusive lock to the Firestore client's offline persistence

转载 作者:行者123 更新时间:2023-11-29 18:58:14 31 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,我在其中每 10 秒更新一次用户的位置。为此,我在服务中运行一个 timerTask 并将 LatLng 值写入 Firestore 数据库。

下面是我的timerTask类。

class UploadDataTimerTask extends TimerTask {

@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {

@Override
public void run() {

Log.d("TAG", String.valueOf(mLatLong));

mFireStore.collection(Constants.LOCATION_REFERENCE).document(mUser.getUid()).set(mLatLong).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {
Log.d("TAG", "Upload successful.");
}
}
});
}
});
}
}

但是,当我尝试将此数据写入 Firestore 时出现以下错误。

FATAL EXCEPTION: main
Process: com.sarthak.trackit.trackit:my_service, PID: 24286
java.lang.RuntimeException: Internal error in Firestore (0.6.6-dev).
at com.google.android.gms.internal.zzeux.run(Unknown Source:23)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6809)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.RuntimeException: Failed to gain exclusive lock to the Firestore client's offline persistence. This generally means you are using Firestore from multiple processes in your app. Keep in mind that multi-process Android apps execute the code in your Application class in all processes, so you may need to avoid initializing Firestore in your Application class. If you are intentionally using Firestore from multiple processes, you can only enable offline persistence (i.e. call setPersistenceEnabled(true)) in one of them.
at com.google.android.gms.internal.zzeqn.start(Unknown Source:34)
at com.google.android.gms.internal.zzenf.zza(Unknown Source:54)
at com.google.android.gms.internal.zzenh.run(Unknown Source:8)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at com.google.android.gms.internal.zzeuu$zza.run(Unknown Source:7)
at java.lang.Thread.run(Thread.java:764)
Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:833)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:818)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:721)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:740)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:300)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194)
at com.google.android.gms.internal.zzeqn.start(Unknown Source:19)
at com.google.android.gms.internal.zzenf.zza(Unknown Source:54) 
at com.google.android.gms.internal.zzenh.run(Unknown Source:8) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
at com.google.android.gms.internal.zzeuu$zza.run(Unknown Source:7) 
at java.lang.Thread.run(Thread.java:764) 

我搜索了很多,但没能完全找到问题所在。我该如何解决这个问题?

最佳答案

Firestore 无法从与其在第一次写入操作时拥有的线程不同的线程访问,因为这是创建对本地数据库的引用的时间,请记住 Firestore 异步运行它们的所有操作(它们不会阻塞调用线程)但是它们的回调是在主循环器上调用的,这意味着,查看您的代码,您的问题已解决删除处理程序的帖子和 < em>推荐 为回调传递一个执行器,例如:

mFireStore.collection(Constants.LOCATION_REFERENCE).document(mUser.getUid()).set(mLatLong).addOnCompleteListener(Executors.newSingleThreadExecutor(),new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {
Log.d("TAG", "Upload successful.");
}
}
});
}
});
}

关于Android Firestore : Failed to gain exclusive lock to the Firestore client's offline persistence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49518993/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com