想了解Firestore-在本地合并两个查询的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于android–FirebaseFirestore–或查询、FirebaseAdminSDK
想了解Firestore-在本地合并两个查询的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于android – Firebase Firestore – 或查询、Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时、Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空、Firestore onSnapshot:一个查询复杂或多个查询简单的新知识。
本文目录一览:- Firestore-在本地合并两个查询
- android – Firebase Firestore – 或查询
- Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时
- Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空
- Firestore onSnapshot:一个查询复杂或多个查询简单
Firestore-在本地合并两个查询
由于ORFirestore中没有逻辑运算符,因此我尝试在本地合并2个单独的查询。
现在,我想知道如何保持结果的正确顺序。当我独立运行2个查询时,我无法明确地查询结果(至少不是我使用该orderBy方法从Firestore获取结果的顺序)。
我的想法是将第二个查询放在第一个查询的内部onSuccessListener
。这是一个坏主意的表现明智的选择吗?
public void loadNotes(View v) { collectionRef.whereLessThan("priority", 2) .orderBy("priority") .get() .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { @Override public void onSuccess(QuerySnapshot queryDocumentSnapshots) { for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) { Note note = documentSnapshot.toObject(Note.class); //adding the results to a List } collectionRef.whereGreaterThan("priority", 2) .orderBy("priority") .get() .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { @Override public void onSuccess(QuerySnapshot queryDocumentSnapshots) { for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) { Note note = documentSnapshot.toObject(Note.class); //adding the results to a List } } }); } });}
答案1
小编典典要在本地合并2个单独的查询,建议您使用Tasks.whenAllSuccess()
方法。您可以使用以下代码行实现此目的:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();Query firstQuery = rootRef...Query secondQuery = rootRef...Task firstTask = firstQuery.get();Task secondTask = secondQuery.get();Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() { @Override public void onSuccess(List<Object> list) { //Do what you need to do with your list }});
如您所见,当重写该onSuccess()方法时,结果是list对象的,这些对象具有作为参数传递给whenAllSuccess()方法的任务的确切顺序。
还有另一种方法,那就是使用Tasks.continueWith()方法。但是根据您的应用程序的用例,您可以使用whenAllSuccess()一种或多种continueWith()方法。请参阅此处的官方文档。
android – Firebase Firestore – 或查询
如何通过一个字段的多个值获取数据?例如,我有包含帖子的数据库,我想查询blogId为1或2的所有帖子,按时间戳排序.
collection("posts").whereEqualTo("blogId", "1")
.whereEqualTo("blogId", 2).orderBy("timestamp", Query.Direction.DESCENDING).limit(50)
上面的代码不起作用:(
怎么做到这一点?
问候 :)
解决方法:
我找不到任何有关OR条件的OR的能力的文档.但您可以在blogId上重写您的要求,如下所示:
WHERE blogId > 0 AND blogId < 3
试试这段代码:
collection("posts")
.where("blogId", ">", "0")
.where("blogId", "<", "3")
.orderBy("timestamp", Query.Direction.DESCENDING)
.limit(50)
Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时
如何解决Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时?
我一直在努力使后端Java应用程序运行。它在IntelliJ IDE中完全可以正常工作。但是,当我使用maven将其编译为Shadowjar时,admin SDK无法使用FirestoreClient运行监听功能。通过一些调试,我发现即使从.jar运行,该应用程序也可以吐出身份验证数据,并且可以检索用户的电子邮件-因此它肯定已通过身份验证并且可以正常工作。大约10分钟后,我收到与调用FirestoreClient.collection().addSnapshotListener
任何帮助将不胜感激。
private FirebaseHandler(){
FirebaSEOptions options;
try {
options = new FirebaSEOptions.Builder()
.setCredentials(GoogleCredentials.getApplicationDefault())
.setDatabaseUrl("https://crypto-rabbi-1599966847997.firebaseio.com")
.build();
FirebaseApp.initializeApp(options);
database = FirestoreClient.getFirestore();
getAlertListener();
getTradeListener();
Message message = Message.builder()
.setToken("cP9xTCfUR7C8XeKabM6zIB:APA91bFXavA3xUFv7GTTmczu_ATUx21FVReNNr-o-Ze9lh-6xDdGjK2FeeG-ZwZU7Sm8_xtueisKenQ8ipNLW9RCnm4LKv4tdeusgF5KzLPRv2Fp7T59TAGba1RzsCAMWVxsnh2hmfWX")
.setAndroidConfig(
AndroidConfig.builder().setNotification(
AndroidNotification.builder()
.setTitle("HIO")
.setBody("WTF")
.setDefaultSound(true)
.setPriority(AndroidNotification.Priority.HIGH)
.setDefaultLightSettings(true)
.setChannelId("PALERT")
.build())
.build())
.build();
FirebaseMessaging.getInstance().sendAsync(message);
} catch (FileNotFoundException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
}
}
private void getTradeListener() {
database.collection("Trades")
.addSnapshotListener((snapshots,e)->{
if (e != null) {
System.err.println("Listen Failed:" + e);
try {
getTradeListener();
} catch (Exception executionException) {
executionException.printstacktrace();
}
return;
}
//for each document one per user Trading
for (DocumentSnapshot doc :snapshots
) {
String uID = doc.getId(); //null ptr exception here,document is null
Map<String,Object> TradeMap = doc.getData();
//each Trade for the individual user
for (Map.Entry<String,Object> Trade: TradeMap.entrySet()
) {
//get the individual Trade (one per symbol) and create the data from it
Map<String,Object> TradeEntry = (Map<String,Object>) Trade.getValue();
String key = TradeEntry.get("symbol") + "_" + uID;
AutoTradeData autoTradeData = new AutoTradeData(TradeEntry);
if(TradeEntry.get("status").equals("Canceling")){ // if the Trade is canceling get rid of it from the database
System.out.println("Canceling Trade: " + key);
if(TradeHandler.getInstance().autoTradesMap.containsKey(key)){
System.out.println("Removed Trade from map: " + key);
TradeHandler.getInstance().autoTradesMap.remove(key);
}
database.collection("Trades").document(uID).update(TradeEntry.get("symbol").toString(),FieldValue.delete());
break;
}
else if (!TradeHandler.getInstance().autoTradesMap.containsKey(key)) { // else if the Trade that was updated is not in our activeTradelist
if (TradeEntry.get("status").toString().contains("Idle")) { // if the Trade is idle and we dont already have it,it must be new
System.out.println("New Trade: " + autoTradeData.symbol);
TradeHandler.getInstance().autoTradesMap.put(autoTradeData.symbol + "_" + uID,autoTradeData); // put this Trade in the book
}
}
if(!TradeHandler.getInstance().candleStickMap.containsKey(autoTradeData.symbol) && !TradeEntry.get("status").equals("Canceling")) { // if we dont already have data for the symbol we are Trading add it
BinanceHandler.getInstance().getCandlestickListener(autoTradeData.symbol);
}
if (!TradeHandler.getInstance().syncRequestClientMap.keySet().contains(uID) && !TradeEntry.get("status").equals("Canceling")) {
database.collection("users").document(uID).addSnapshotListener((snapshot,e2) -> {
if (e2 != null) {
System.err.println("Listen Failed:" + e2);
return;
}
User user = snapshot.toObject(User.class);
RequestOptions options = new RequestOptions();
SyncRequestClient syncRequestClient = SyncRequestClient.create(user.apiKey,user.secretKey,options);
TradeHandler.getInstance().syncRequestClientMap.put(uID,syncRequestClient);
System.out.println("New SyncReq Client for " + uID + " " + syncRequestClient.getAccountinformation().getMaxWithdrawAmount().doubleValue());
});
}
}
}
});
}
private void getAlertListener(){
AlertHandler alertHandler = AlertHandler.getInstance();
database.collection("alerts")
.addSnapshotListener((snapshots,e) -> {
if (e != null) {
System.err.println("Listen Failed:" + e);
getAlertListener();
return;
}
AlertHandler.getInstance().alertList = new ArrayList<>();
for (DocumentSnapshot doc : snapshots) {
String messagetoken = doc.getString("messagetoken");
((List<Object>) doc.get("alertData")).forEach((response)->{
Map<String,Object> data = (Map<String,Object>) response;
PriceAlert.SerializedData priceData= new PriceAlert.SerializedData(data);
PriceAlert alert = new PriceAlert(priceData,messagetoken,doc.getId(),doc.getString("alertID"));
alertHandler.alertList.add(alert);
});
}
for (PriceAlert alert: AlertHandler.getInstance().alertList
) {
System.out.println(alert.data.symbol +"_"+alert.data.price);
}
});
}
java.util.concurrent.ExecutionException: com.google.api.gax.rpc.UnavailableException: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
at com.google.common.util.concurrent.AbstractFuture.getDoneValue([AbstractFuture.java:564](https://AbstractFuture.java:564))
at com.google.common.util.concurrent.AbstractFuture.get([AbstractFuture.java:545](https://AbstractFuture.java:545))
at com.google.api.core.AbstractApiFuture.get([AbstractApiFuture.java:56](https://AbstractApiFuture.java:56))
at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.getTradeListener([FirebaseHandler.java:65](https://FirebaseHandler.java:65))
at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<init>([FirebaseHandler.java:48](https://FirebaseHandler.java:48))
at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<clinit>([FirebaseHandler.java:22](https://FirebaseHandler.java:22))
at com.awaiteddev.cryptorabbiadmin.Main.main([Main.java:20](https://Main.java:20))
Caused by: com.google.api.gax.rpc.UnavailableException: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
at com.google.api.gax.rpc.ApiExceptionFactory.createException([ApiExceptionFactory.java:69](https://ApiExceptionFactory.java:69))
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create([GrpcApiExceptionFactory.java:72](https://GrpcApiExceptionFactory.java:72))
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create([GrpcApiExceptionFactory.java:60](https://GrpcApiExceptionFactory.java:60))
at com.google.api.gax.grpc.ExceptionResponSEObserver.onErrorImpl([ExceptionResponSEObserver.java:82](https://ExceptionResponSEObserver.java:82))
at com.google.api.gax.rpc.StateCheckingResponSEObserver.onError([StateCheckingResponSEObserver.java:86](https://StateCheckingResponSEObserver.java:86))
at com.google.api.gax.grpc.GrpcDirectStreamController$ResponSEObserverAdapter.onClose([GrpcDirectStreamController.java:149](https://GrpcDirectStreamController.java:149))
at io.grpc.internal.ClientCallImpl.cloSEObserver([ClientCallImpl.java:426](https://ClientCallImpl.java:426))
at io.grpc.internal.ClientCallImpl.access$500([ClientCallImpl.java:66](https://ClientCallImpl.java:66))
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close([ClientCallImpl.java:689](https://ClientCallImpl.java:689))
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$900([ClientCallImpl.java:577](https://ClientCallImpl.java:577))
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal([ClientCallImpl.java:751](https://ClientCallImpl.java:751))
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext([ClientCallImpl.java:740](https://ClientCallImpl.java:740))
at [io.grpc.internal.ContextRunnable.run](https://io.grpc.internal.ContextRunnable.run)([ContextRunnable.java:37](https://ContextRunnable.java:37))
at [io.grpc.internal.SerializingExecutor.run](https://io.grpc.internal.SerializingExecutor.run)([SerializingExecutor.java:123](https://SerializingExecutor.java:123))
at [java.util.concurrent.Executors$RunnableAdapter.call](https://java.util.concurrent.Executors$RunnableAdapter.call)(UnkNown Source)
at [java.util.concurrent.FutureTask.run](https://java.util.concurrent.FutureTask.run)(UnkNown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(UnkNown Source)
at [java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run](https://java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run)(UnkNown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(UnkNown Source)
at [java.util.concurrent.ThreadPoolExecutor$Worker.run](https://java.util.concurrent.ThreadPoolExecutor$Worker.run)(UnkNown Source)
at [java.lang.Thread.run](https://java.lang.Thread.run)(UnkNown Source)
Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
at io.grpc.Status.asRuntimeException([Status.java:533](https://Status.java:533))
... 16 more
Caused by: io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection timed out: no further information: [firestore.googleapis.com/2607:f8b0:400a:804:0:0:0:200a:443](https://firestore.googleapis.com/2607:f8b0:400a:804:0:0:0:200a:443)
Caused by: java.net.ConnectException: Connection timed out: no further information
at sun.nio.ch.socketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.socketChannelImpl.finishConnect(UnkNown Source)
at io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect([NioSocketChannel.java:330](https://NioSocketChannel.java:330))
at io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioChannel$AbstractNIoUnsafe.finishConnect([AbstractNioChannel.java:334](https://AbstractNioChannel.java:334))
at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey([NioEventLoop.java:702](https://NioEventLoop.java:702))
at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized([NioEventLoop.java:650](https://NioEventLoop.java:650))
at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys([NioEventLoop.java:576](https://NioEventLoop.java:576))
at [io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run](https://io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run)([NioEventLoop.java:493](https://NioEventLoop.java:493))
at [io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run](https://io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run)([SingleThreadEventExecutor.java:989](https://SingleThreadEventExecutor.java:989))
at [io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run](https://io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run)([ThreadExecutorMap.java:74](https://ThreadExecutorMap.java:74))
at [io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run](https://io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run)([FastThreadLocalRunnable.java:30](https://FastThreadLocalRunnable.java:30))
at [java.lang.Thread.run](https://java.lang.Thread.run)(UnkNown Source)
java.lang.NullPointerException
at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.getTradeListener([FirebaseHandler.java:71](https://FirebaseHandler.java:71))
at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<init>([FirebaseHandler.java:48](https://FirebaseHandler.java:48))
at com.awaiteddev.cryptorabbiadmin.FirebaseHandler.<clinit>([FirebaseHandler.java:22](https://FirebaseHandler.java:22))
at com.awaiteddev.cryptorabbiadmin.Main.main([Main.java:20](https://Main.java:20))t this error:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空
这是由于 Firebase 调用的 "latency compensation":
您应用中的本地写入将立即调用快照侦听器。 这是因为一个称为“延迟补偿”的重要功能。 当您执行写入时,您的听众将收到新的通知 数据发送到后端之前的数据。
你的快照是在离开你的应用之前触发的,时间戳字段为null
,然后在到达后端并设置时间戳后再次触发。
要区分两者,请使用文档中所述的字段 metadata.hasPendingWrites
。
Firestore onSnapshot:一个查询复杂或多个查询简单
就成本而言,读取的X文档总是成本为X文档。接受多少查询都没有关系。您还将为通过评估安全规则阅读的每个文档付费。如果您仅遵循documentation中的信息,则计算成本确实非常容易。没有任何隐藏费用。
就性能而言,在多个查询和单个查询之间并没有太大的区别。除非您要处理大量文档,否则根据文档的大小和数量以及网络连接的质量,您可能会看到可比的性能。所有读取的文档都通过单个连接进行流水线传输,因此从多个侦听器(而不是一个侦听器)接收文档没有实质性区别。如果您有疑虑,应该自己对此进行基准测试。
今天关于Firestore-在本地合并两个查询的分享就到这里,希望大家有所收获,若想了解更多关于android – Firebase Firestore – 或查询、Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时、Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空、Firestore onSnapshot:一个查询复杂或多个查询简单等相关知识,可以在本站进行查询。
本文标签: