GVKun编程网logo

Firestore-在本地合并两个查询

16

想了解Firestore-在本地合并两个查询的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于android–FirebaseFirestore–或查询、FirebaseAdminSDK

想了解Firestore-在本地合并两个查询的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于android – Firebase Firestore – 或查询、Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时、Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空、Firestore onSnapshot:一个查询复杂或多个查询简单的新知识。

本文目录一览:

Firestore-在本地合并两个查询

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 – 或查询

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数据库时超时

如何解决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 Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空

这是由于 Firebase 调用的 "latency compensation":

您应用中的本地写入将立即调用快照侦听器。 这是因为一个称为“延迟补偿”的重要功能。 当您执行写入时,您的听众将收到新的通知 数据发送到后端之前的数据。

你的快照是在离开你的应用之前触发的,时间戳字段为null,然后在到达后端并设置时间戳后再次触发。

要区分两者,请使用文档中所述的字段 metadata.hasPendingWrites

Firestore onSnapshot:一个查询复杂或多个查询简单

Firestore onSnapshot:一个查询复杂或多个查询简单

就成本而言,读取的X文档总是成本为X文档。接受多少查询都没有关系。您还将为通过评估安全规则阅读的每个文档付费。如果您仅遵循documentation中的信息,则计算成本确实非常容易。没有任何隐藏费用。

就性能而言,在多个查询和单个查询之间并没有太大的区别。除非您要处理大量文档,否则根据文档的大小和数量以及网络连接的质量,您可能会看到可比的性能。所有读取的文档都通过单个连接进行流水线传输,因此从多个侦听器(而不是一个侦听器)接收文档没有实质性区别。如果您有疑虑,应该自己对此进行基准测试。

今天关于Firestore-在本地合并两个查询的分享就到这里,希望大家有所收获,若想了解更多关于android – Firebase Firestore – 或查询、Firebase Admin SDK Java,FirestoreClient在尝试监听Firestore数据库时超时、Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空、Firestore onSnapshot:一个查询复杂或多个查询简单等相关知识,可以在本站进行查询。

本文标签: