如何在firebase Android中搜索值

时间:2015-12-30 21:16:38

标签: android firebase firebase-realtime-database

我在Firebase中保存数据如下:

structure

我想查找标题中包含#Yahoo的所有记录。对此的确切查询是什么?

我对创建的随机密钥感到困惑。我不知道如何处理这个,所以我在这里发布它。

Firebase firebase = new Firebase(Constants.FIREBASE_URL_USER_TASKS).child(Utils.encodeEmail(unProcessedEmail));
        Query queryRef = firebase.orderByKey().startAt("#" + mHashTag).endAt("#" + mHashTag + "\uf8ff");

        queryRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                mTasksList.clear();
                mAdapter.notifyDataSetChanged();
                for (DataSnapshot task : dataSnapshot.getChildren()) {
                    mTasksList.add(task.getValue(TaskModel.class));
                }
                mAdapter.notifyItemRangeInserted(0, mTasksList.size());
                mSwipeToRefresh.post(new Runnable() {
                    @Override
                    public void run() {
                        mSwipeToRefresh.setRefreshing(false);
                    }
                });
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                mSwipeToRefresh.post(new Runnable() {
                    @Override
                    public void run() {
                        mSwipeToRefresh.setRefreshing(false);
                    }
                });
            }
        });

7 个答案:

答案 0 :(得分:17)

您无法搜索标题包含 #Yahoo的任何项目。看到:  How to perform sql "LIKE" operation on firebase?

但是,您可以搜索标题 #Yahoo开头的项目:

Firebase firebase = new Firebase(Constants.FIREBASE_URL_USER_TASKS).child(Utils.encodeEmail(unProcessedEmail));

Query queryRef = firebase.orderByChild("title").startAt("#" + mHashTag)

为了更好地完成这项工作,您必须添加index to your Firebase rules

"rules": {
  "userTasks": {
    "$email": {
      ".indexOn": "title" // index tasks in their title property
    }
  }
}

答案 1 :(得分:4)

这适用于Google Firebase。

DatabaseReference mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
    Query query = mFirebaseDatabaseReference.child("userTasks").orderByChild("title").equalTo("#Yahoo");
    query.addValueEventListener(valueEventListener);

ValueEventListener valueEventListener = new ValueEventListener()
{
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        for (DataSnapshot postSnapshot : dataSnapshot.getChildren())
        {
            //TODO get the data here

        }

    }

    @Override
    public void onCancelled(DatabaseError databaseError)
    {

    }
};

答案 2 :(得分:3)

    DatabaseReference mDatabase =FirebaseDatabase.getInstance().getReference("userTasks");
    mDatabase.orderByChild("title").equalTo("#Yahoo").addListenerForSingleValueEvent(new ValueEventListener() {
               @Override
               public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
       ///Here you can get all data 
    }
    @Override
     public void onCancelled(DatabaseError databaseError) {}
});

答案 3 :(得分:0)

尝试以下代码

DatabaseReference mDatabaseRef =FirebaseDatabase.getInstance().getReference("userTasks");

  Query query=mDatabaseRef.orderByChild("title").equalTo("#Yahoo");

    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot data:dataSnapshot.getChildren()){


                Records models=data.getValue(Records.class);
                String latitude=models.getLatitude();
                String longitude=models.getLongitude();

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我在这里只声明了两个字符串,纬度和经度。如果要加载更多值,还需要添加它。

然后创建一个新类记录如下

public class Records {

public String latitude,longitude;

public Records()
{

}

public String getLatitude() {
    return latitude;
}

public void setLatitude(String latitude) {
    this.latitude = latitude;
}

public String getLongitude() {
    return longitude;
}

public void setLongitude(String longitude) {
    this.longitude = longitude;
} }

答案 4 :(得分:0)

答案:只需执行以下查询:

databaseReference.orderByChild('_searchLastName')
 .startAt(queryText)
 .endAt(queryText+"\uf8ff");

我们可以将startAt和endAt结合起来限制查询的两端。以下示例查找名称以字母b开头的所有恐龙:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'

上面查询中使用的\uf8ff字符是Unicode范围内的一个非常高的代码点。由于它位于Unicode中的大多数常规字符之后,因此查询将匹配以b开头的所有值。

这是related questionofficial docs

答案 5 :(得分:0)

我知道这很晚了,但是这个解决方案对我有用。

 getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                        MediaStore.Video.VideoColumns.DATA + "=?" , new String[]{ paths.get(i) });

答案 6 :(得分:0)

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference animalsRef = rootRef.child("userTasks");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Boolean found;
        String search = "Yahoo";
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String movieName = ds.child("movieName").getValue(String.class);
            found = movieName.contains(search);
            Log.d("TAG", movieName + " / " + found);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
animalsRef.addListenerForSingleValueEvent(eventListener);