GeoFirestore:getAtLocation 未返回完整的文档列表
GeoFirestore: getAtLocation not returning the full list of documents
GeoFirestore 至少有两种方法可以 returning Firestore 中的文档。
getAtLocation()
和 geoFirestore.queryAtLocation(new GeoPoint(lati, longi), radi).addGeoQueryDataEventListener()
根据文档,getAtLocation()
将 return 到 SingleGeoQueryDataEventCallback
该区域中所有文档的列表,如果出现问题,则会出现异常。
以下是我进行查询的方式:
if (!lat.getText().toString().isEmpty()) {
lati = Double.parseDouble(lat.getText().toString());
longi = Double.parseDouble(lon.getText().toString());
}
double radi = Double.parseDouble(rad.getText().toString());
Log.i(TAG, "onClick: radius is "+radi);
geoFirestore.getAtLocation(new GeoPoint(lati, longi), radi, new GeoFirestore.SingleGeoQueryDataEventCallback() {
@Override
public void onComplete(@Nullable List<? extends DocumentSnapshot> list, @Nullable Exception e) {
//Log.i(TAG, "GeoFirestore: onComplete");
if (e != null) {
Log.i(TAG, "GeoFirestore: onComplete: error");
return;
} else {
Log.i(TAG, "GeoFirestore: onComplete: list.size() is "+list.size());
for (DocumentSnapshot documentSnapshot : list) {
Log.i(TAG, "GeoFirestore: onComplete: documentSnapshot is "+documentSnapshot);
}
}
}
});
geoQuery = geoFirestore.queryAtLocation(new GeoPoint(lati, longi), radi);
geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
@Override
public void onDocumentEntered(@NotNull DocumentSnapshot documentSnapshot, @NotNull GeoPoint geoPoint) {
Log.i(TAG, "onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onDocumentExited(@NotNull DocumentSnapshot documentSnapshot) {
Log.i(TAG, "onDocumentExited: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onDocumentMoved(@NotNull DocumentSnapshot documentSnapshot, @NotNull GeoPoint geoPoint) {
Log.i(TAG, "onDocumentMoved: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onDocumentChanged(@NotNull DocumentSnapshot documentSnapshot, @NotNull GeoPoint geoPoint) {
Log.i(TAG, "onDocumentChanged: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onGeoQueryReady() {
Log.i(TAG, "onGeoQueryReady: addGeoQueryDataEventListener");
}
@Override
public void onGeoQueryError(@NotNull Exception e) {
Log.i(TAG, "onGeoQueryError: addGeoQueryDataEventListener");
}
});
下面是两个查询的结果:
debinf FirebaseAct: onClick: radius is 10.0
debinf FirebaseAct: onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is DocumentSnapshot{key=Stores/P7FfBlnChxqkjABsONSo, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/P7FfBlnChxqkjABsONSo, data=ArraySortedMap{(address=>av. fernandes lima, s/n - farol), (city=>maceio), (g=>7nq96cb3e3), (id=>222222222), (image=>http://walmart), (l=>GeoPoint { latitude=-9.614147, longitude=-35.738036 }), (name=>walmart), (opening=>ArraySortedMap{(fri=>07:00-23:59), (mon=>07:00-23:59), (sat=>07:00-22:00), (sun=>07:00-18:00), (thu=>07:00-23:59), (tue=>07:00-23:59), (wed=>07:00-23:59)};), (phone=>), (state=>alagoas)};, version=SnapshotVersion(seconds=1574434563, nanos=920733000), documentState=SYNCED}}
debinf FirebaseAct: onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is DocumentSnapshot{key=Stores/iKIZ9n54jpnThvNx0Prw, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/iKIZ9n54jpnThvNx0Prw, data=ArraySortedMap{(address=>avenida maceio, s/n - Tabuleiro), (city=>maceio), (g=>7nq96p934s), (id=>333333333), (image=>http://gbarbosa), (l=>GeoPoint { latitude=-9.58262891, longitude=-35.76965511 }), (name=>GBarbosa), (opening=>ArraySortedMap{(fri=>07:00-21:00), (mon=>07:00-21:00), (sat=>07:00-21:00), (sun=>07:00-18:00), (thu=>07:00-21:00), (tue=>07:00-21:00), (wed=>07:00-21:00)};), (phone=>), (state=>alagoas)};, version=SnapshotVersion(seconds=1574445438, nanos=550840000), documentState=SYNCED}}
debinf FirebaseAct: onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is DocumentSnapshot{key=Stores/8HU4UdSLNEaCg5eqeZbq, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/8HU4UdSLNEaCg5eqeZbq, data=ArraySortedMap{(address=>avenida vereador dario marsiglia, s/n - cleto marques luz), (city=>maceio), (g=>7nq9d32m26), (id=>123456789), (image=>http://tim), (l=>GeoPoint { latitude=-9.57229704, longitude=-35.76013863 }), (name=>Lider), (opening=>ArraySortedMap{(fri=>07:00-23:59), (mon=>07:00-23:59), (sat=>07:00-23:59), (sun=>07:00-23:59), (thu=>07:00-23:59), (tue=>07:00-23:59), (wed=>07:00-23:59)};), (phone=>ddd xxxx-yyyy), (state=>alagoas)};, version=SnapshotVersion(seconds=1574444945, nanos=558590000), documentState=SYNCED}}
debinf FirebaseAct: onGeoQueryReady: addGeoQueryDataEventListener
debinf FirebaseAct: GeoFirestore: onComplete: list.size() is 1
debinf FirebaseAct: GeoFirestore: onComplete: documentSnapshot is DocumentSnapshot{key=Stores/P7FfBlnChxqkjABsONSo, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/P7FfBlnChxqkjABsONSo, data=ArraySortedMap{(address=>av. fernandes lima, s/n - farol), (city=>maceio), (g=>7nq96cb3e3), (id=>222222222), (image=>http://walmart), (l=>GeoPoint { latitude=-9.614147, longitude=-35.738036 }), (name=>walmart), (opening=>ArraySortedMap{(fri=>07:00-23:59), (mon=>07:00-23:59), (sat=>07:00-22:00), (sun=>07:00-18:00), (thu=>07:00-23:59), (tue=>07:00-23:59), (wed=>07:00-23:59)};), (phone=>), (state=>alagoas)};, version=SnapshotVersion(seconds=1574434563, nanos=920733000), documentState=SYNCED}}
如何使 getAtLocation()
return 像 addGeoQueryDataEventListener()
一样的文档列表?
从 v1.5.0 版本开始,代码和文档之间存在差异。文档指出 queryAtLocation
使用 公里 :
// creates a new query around [37.7832, -122.4056] with a radius of 0.6 kilometers
val geoQuery = geoFirestore.queryAtLocation(GeoPoint(37.7832, -122.4056), 0.6)
但是,代码从 米 转换为纬度:
fun distanceToLatitudeDegrees(distance: Double) = distance / Constants.METERS_PER_DEGREE_LATITUDE
Github 上有一个 open issue。
将米传递给 queryAtLocation 应该可以解决问题。
GeoFirestore 至少有两种方法可以 returning Firestore 中的文档。
getAtLocation()
和 geoFirestore.queryAtLocation(new GeoPoint(lati, longi), radi).addGeoQueryDataEventListener()
根据文档,getAtLocation()
将 return 到 SingleGeoQueryDataEventCallback
该区域中所有文档的列表,如果出现问题,则会出现异常。
以下是我进行查询的方式:
if (!lat.getText().toString().isEmpty()) {
lati = Double.parseDouble(lat.getText().toString());
longi = Double.parseDouble(lon.getText().toString());
}
double radi = Double.parseDouble(rad.getText().toString());
Log.i(TAG, "onClick: radius is "+radi);
geoFirestore.getAtLocation(new GeoPoint(lati, longi), radi, new GeoFirestore.SingleGeoQueryDataEventCallback() {
@Override
public void onComplete(@Nullable List<? extends DocumentSnapshot> list, @Nullable Exception e) {
//Log.i(TAG, "GeoFirestore: onComplete");
if (e != null) {
Log.i(TAG, "GeoFirestore: onComplete: error");
return;
} else {
Log.i(TAG, "GeoFirestore: onComplete: list.size() is "+list.size());
for (DocumentSnapshot documentSnapshot : list) {
Log.i(TAG, "GeoFirestore: onComplete: documentSnapshot is "+documentSnapshot);
}
}
}
});
geoQuery = geoFirestore.queryAtLocation(new GeoPoint(lati, longi), radi);
geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
@Override
public void onDocumentEntered(@NotNull DocumentSnapshot documentSnapshot, @NotNull GeoPoint geoPoint) {
Log.i(TAG, "onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onDocumentExited(@NotNull DocumentSnapshot documentSnapshot) {
Log.i(TAG, "onDocumentExited: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onDocumentMoved(@NotNull DocumentSnapshot documentSnapshot, @NotNull GeoPoint geoPoint) {
Log.i(TAG, "onDocumentMoved: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onDocumentChanged(@NotNull DocumentSnapshot documentSnapshot, @NotNull GeoPoint geoPoint) {
Log.i(TAG, "onDocumentChanged: addGeoQueryDataEventListener - documentSnapshot is "+documentSnapshot);
}
@Override
public void onGeoQueryReady() {
Log.i(TAG, "onGeoQueryReady: addGeoQueryDataEventListener");
}
@Override
public void onGeoQueryError(@NotNull Exception e) {
Log.i(TAG, "onGeoQueryError: addGeoQueryDataEventListener");
}
});
下面是两个查询的结果:
debinf FirebaseAct: onClick: radius is 10.0
debinf FirebaseAct: onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is DocumentSnapshot{key=Stores/P7FfBlnChxqkjABsONSo, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/P7FfBlnChxqkjABsONSo, data=ArraySortedMap{(address=>av. fernandes lima, s/n - farol), (city=>maceio), (g=>7nq96cb3e3), (id=>222222222), (image=>http://walmart), (l=>GeoPoint { latitude=-9.614147, longitude=-35.738036 }), (name=>walmart), (opening=>ArraySortedMap{(fri=>07:00-23:59), (mon=>07:00-23:59), (sat=>07:00-22:00), (sun=>07:00-18:00), (thu=>07:00-23:59), (tue=>07:00-23:59), (wed=>07:00-23:59)};), (phone=>), (state=>alagoas)};, version=SnapshotVersion(seconds=1574434563, nanos=920733000), documentState=SYNCED}}
debinf FirebaseAct: onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is DocumentSnapshot{key=Stores/iKIZ9n54jpnThvNx0Prw, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/iKIZ9n54jpnThvNx0Prw, data=ArraySortedMap{(address=>avenida maceio, s/n - Tabuleiro), (city=>maceio), (g=>7nq96p934s), (id=>333333333), (image=>http://gbarbosa), (l=>GeoPoint { latitude=-9.58262891, longitude=-35.76965511 }), (name=>GBarbosa), (opening=>ArraySortedMap{(fri=>07:00-21:00), (mon=>07:00-21:00), (sat=>07:00-21:00), (sun=>07:00-18:00), (thu=>07:00-21:00), (tue=>07:00-21:00), (wed=>07:00-21:00)};), (phone=>), (state=>alagoas)};, version=SnapshotVersion(seconds=1574445438, nanos=550840000), documentState=SYNCED}}
debinf FirebaseAct: onDocumentEntered: addGeoQueryDataEventListener - documentSnapshot is DocumentSnapshot{key=Stores/8HU4UdSLNEaCg5eqeZbq, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/8HU4UdSLNEaCg5eqeZbq, data=ArraySortedMap{(address=>avenida vereador dario marsiglia, s/n - cleto marques luz), (city=>maceio), (g=>7nq9d32m26), (id=>123456789), (image=>http://tim), (l=>GeoPoint { latitude=-9.57229704, longitude=-35.76013863 }), (name=>Lider), (opening=>ArraySortedMap{(fri=>07:00-23:59), (mon=>07:00-23:59), (sat=>07:00-23:59), (sun=>07:00-23:59), (thu=>07:00-23:59), (tue=>07:00-23:59), (wed=>07:00-23:59)};), (phone=>ddd xxxx-yyyy), (state=>alagoas)};, version=SnapshotVersion(seconds=1574444945, nanos=558590000), documentState=SYNCED}}
debinf FirebaseAct: onGeoQueryReady: addGeoQueryDataEventListener
debinf FirebaseAct: GeoFirestore: onComplete: list.size() is 1
debinf FirebaseAct: GeoFirestore: onComplete: documentSnapshot is DocumentSnapshot{key=Stores/P7FfBlnChxqkjABsONSo, metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=Document{key=Stores/P7FfBlnChxqkjABsONSo, data=ArraySortedMap{(address=>av. fernandes lima, s/n - farol), (city=>maceio), (g=>7nq96cb3e3), (id=>222222222), (image=>http://walmart), (l=>GeoPoint { latitude=-9.614147, longitude=-35.738036 }), (name=>walmart), (opening=>ArraySortedMap{(fri=>07:00-23:59), (mon=>07:00-23:59), (sat=>07:00-22:00), (sun=>07:00-18:00), (thu=>07:00-23:59), (tue=>07:00-23:59), (wed=>07:00-23:59)};), (phone=>), (state=>alagoas)};, version=SnapshotVersion(seconds=1574434563, nanos=920733000), documentState=SYNCED}}
如何使 getAtLocation()
return 像 addGeoQueryDataEventListener()
一样的文档列表?
从 v1.5.0 版本开始,代码和文档之间存在差异。文档指出 queryAtLocation
使用 公里 :
// creates a new query around [37.7832, -122.4056] with a radius of 0.6 kilometers
val geoQuery = geoFirestore.queryAtLocation(GeoPoint(37.7832, -122.4056), 0.6)
但是,代码从 米 转换为纬度:
fun distanceToLatitudeDegrees(distance: Double) = distance / Constants.METERS_PER_DEGREE_LATITUDE
Github 上有一个 open issue。
将米传递给 queryAtLocation 应该可以解决问题。