当前位置: 首页 > 知识库问答 >
问题:

是否可能在FireStoreRecyclerOptions中使用Algolia查询?

梁华清
2023-03-14

为了让我的用户执行更复杂的搜索,我正在使用Algolia。

com.algolia.search.saas.Query algolia_query =
                    new com.algolia.search.saas.Query(mLastQuery)
                    .setAttributesToRetrieve("content")
                    .setAttributesToRetrieve("category")
                    .setHitsPerPage(10);
            index.searchAsync(algolia_query, new CompletionHandler() {
                @Override
                public void requestCompleted(JSONObject jsonObject, AlgoliaException e) {
                    Log.d("algolia", jsonObject.toString());
                }
            });

我想将此jsonObject转换为与FireStoreRecyclerOptions兼容的东西,以便能够使用FireStoreRecyclerAdapter

谢谢你!

共有1个答案

姚建树
2023-03-14

为了更好地理解,我将尝试用一个例子来解释这一点。假设有一个FireBaseFireStore对象指向数据库的根引用,还有一个CollectionReference对象指向名为Products的集合。为此,我们可以使用以下两行代码:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference productsRef = rootRef.collection("products");

让我们同样假设我们有一个云Firestore数据库,它如下所示:

Firestore-root
     |
     --- products
            |
            --- productIdOne
            |      |
            |      --- productName: "Milk"
            |
            --- productIdTwo
                   |
                   --- productName: "Soy Milk"
            |
            --- productIdThree
                   |
                   --- productName: "Bacon"

为了实现这种结构,让我们使用下面的代码将这些产品和相应的索引添加到数据库中:

Map<String, Object> mapOne = new HashMap<>();
mapOne.put("productName", "Milk");
Map<String, Object> mapTwo = new HashMap<>();
mapTwo.put("productName", "Soy Milk");
Map<String, Object> mapThree = new HashMap<>();
mapThree.put("productName", "Bacon");

WriteBatch writeBatch = rootRef.batch();
writeBatch.set(productsRef.document(), mapOne);
writeBatch.set(productsRef.document(), mapTwo);
writeBatch.set(productsRef.document(), mapThree);
writeBatch.commit();

Client client = new Client(YourApplicationID, YourAPIKey);
Index index = client.getIndex("products");

List<JSONObject> productList = new ArrayList<>();
productList.add(new JSONObject(mapOne));
productList.add(new JSONObject(mapTwo));
productList.add(new JSONObject(mapThree));
index.addObjectsAsync(new JSONArray(productList), null);
EditText editText = findViewById(R.id.edit_text);
ListView listView = findViewById(R.id.list_view);
productsRef.get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    List<String> list = new ArrayList<>();
                    for (DocumentSnapshot document : task.getResult()) {
                        list.add(document.getString("productName"));
                    }
                    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, list);
                    listView.setAdapter(arrayAdapter);
                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
                }
            }
        });
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    @Override
    public void afterTextChanged(Editable editable) {
        Query query = new Query(editable.toString())
                .setAttributesToRetrieve("productName")
                .setHitsPerPage(50);
        index.searchAsync(query, new CompletionHandler() {
            @Override
            public void requestCompleted(JSONObject content, AlgoliaException error) {
                try {
                    JSONArray hits = content.getJSONArray("hits");
                    List<String> list = new ArrayList<>();
                    for (int i = 0; i < hits.length(); i++) {
                        JSONObject jsonObject = hits.getJSONObject(i);
                        String productName = jsonObject.getString("productName");
                        list.add(productName);
                    }
                    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, list);
                    listView.setAdapter(arrayAdapter);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }
});

所以为了使它工作,我们创建了一个新的适配器对象。这意味着,对于在edittext中键入的每个字符,我们都将创建一个新的适配器,并使用来自数据库的结果填充该适配器。为了回答您的问题,为了实现您想要的,您不必更改JSONObject,您已经创建了一个新的查询对象,该查询对象应该传递给setQuery()方法,该方法在FireStoreRecyclerOptions对象上调用。我只是给了你一个更简单的例子来理解流程。想要了解更多信息,我也推荐你看这个视频。

 类似资料:
  • 问题内容: 我有一个这样声明的JS对象 我还有一个$ http请求,该请求用项目填充此对象。我想检测该项目是否为空,看来ng-show支持此项目。我输入 而且它神奇地起作用了,我也想从控制器上做同样的事情,但是我似乎无法使它起作用,看来我可能不得不遍历该对象以查看它是否具有任何属性,或者使用lodash或下划线。 还有其他选择吗? 我确实尝试过 但在创建对象并填充时,它始终返回false,因此它不

  • -用户(顶级集合): ----user1(doc): --------pets(子集合): ----------pet1(doc) ----------pet2(doc) ---------pets(子集合): -----------pet3(doc) -------------pet4(doc) 如果我有一个IDS列表: 有没有一种方法可以做这样的事情,然后得到一个文档快照列表? 它适用于根集合

  • 我正在用MockMvc做一些测试,我想验证JSON响应的结构。具体地说,我希望确保某个属性的键存在,并且该值是某种类型或NULL。 是否有任何聪明的Hamcrest匹配器可以应用于每个属性的单个json路径?

  • 我的MongoDB集合中有一个深度嵌套的集合。 当我运行以下查询时: 我在这里得到了这个嵌套结果: 现在,这就是我想要的: 或者这个: 或者其他类似的东西…这可能吗?

  • 我在flock手册中找到以下描述: 默认情况下,此功能将一直阻止,直到获得请求的锁为止 在下面,我找到了以下示例代码: 但是,是否存在脚本实际返回“无法获取锁”的情况 ?我以为它会等到文件