Firebaseで次のようにデータを保存しています。
タイトルに#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);
}
});
}
});
タイトルに含まれる#Yahoo
。参照: firebaseでsql "LIKE"操作を実行する方法
ただし、タイトルがで始まるアイテムを検索できます#Yahoo
:
Firebase firebase = new Firebase(Constants.FIREBASE_URL_USER_TASKS).child(Utils.encodeEmail(unProcessedEmail));
Query queryRef = firebase.orderByChild("title").startAt("#" + mHashTag)
これをうまく機能させるには、 Firebaseルールのインデックス を追加する必要があります:
"rules": {
"userTasks": {
"$email": {
".indexOn": "title" // index tasks in their title property
}
}
}
これは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)
{
}
};
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) {}
});
私はこれが遅いことを知っていますが、この解決策は私にとってはうまくいきました。
getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
MediaStore.Video.VideoColumns.DATA + "=?" , new String[]{ paths.get(i) });
次のコードを試してください
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) {
}
});
ここでは、緯度と経度の2つの文字列のみを宣言しました。さらに値をロードする場合は、それも追加する必要があります。
次に、次のように新しいクラスRecordsを作成します
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;
} }
回答:次のクエリを実行してください:
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
で始まるすべての値に一致します。