GeoFire与实时数据库紧密耦合,而地理查询是许多希望迁移到Firestore的应用程序的常见功能依赖.有没有办法在Firestore环境中复制散列/检索位置?
firebase geofire firebase-realtime-database google-cloud-firestore
我开发一个应用程序,并节省一些字符串一样postedAtTime,postedBy,postedOnDate在火力地堡数据库.我想将GeoFire坐标保存在保存所有上述字符串的同一节点中,以便稍后我可以轻松地进行查询.
这是我保存所有字符串的路径:
databaseReferenceHRequests = firebaseDatabase.getReferenceFromUrl("https://appName-e1a35.firebaseio.com/requests/");
Run Code Online (Sandbox Code Playgroud)
这是我如何保存它:
// in onButtonClicked method:
postNewRequest(null, imageUID, MainActivity.userName.getText().toString(), time, date, utcFormatDateTime, MainActivity.userEmail.getText().toString(), geoFire);
// the method:
public void postNewRequest(Bitmap bitmap, String imageUIDh, String postedBy, String postedAtTime, String postedOnDate, String utcFormatDateTime, String userEmail, GeoFire geoFire) {
HRequest hRequest = new HelpRequest(null, imageUIDh, postedBy, postedAtTime, postedOnDate, utcFormatDateTime, userEmail, geoFire);
databaseReferenceHRequests.push().setValue(hRequest);
}
Run Code Online (Sandbox Code Playgroud)
以下是它如何保存在数据库中:
我想要的是将GeoFire坐标保存在同一个节点中,就-KLIoLUsI0SpQZGpV1h4在这里.这只是一个推送ID,它随机生成.
我试过这个参考:
geoFire = new GeoFire(firebaseDatabase.getReferenceFromUrl("https://appName-e1a35.firebaseio.com/requests/"));
Run Code Online (Sandbox Code Playgroud)
然后用上面显示的其他项目推送它.但是,这只保存了GeoFire坐标而不保存节点下的其他项目requests.
那么,我的GeoFire参考应该是什么,以便它与同一节点中的所有数据一起保存?
这里出了什么问题?请告诉我.
我正在尝试使用后台服务为监视器创建地理围栏.地理围栏创建成功并在应用程序活动打开时工作,但在关闭应用程序地理围栏时不起作用.我现在应该怎么做.我的代码是:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
ref = FirebaseDatabase.getInstance().getReference("MyLocation");
geoFire = new GeoFire(ref);
mVerticalSeekBar = (VerticalSeekBar)findViewById(R.id.verticalSeekBar);
setUpdateLocation();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case MY_PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { …Run Code Online (Sandbox Code Playgroud) 我需要一个解决方案,根据密钥对多个项目进行Firebase DB API调用,并返回这些密钥的数据(子项)(在一个响应中).
由于我不需要实时数据,某种标准REST调用只做一次(而不是Firebase数据库监听器),我认为这是理想的.
该应用程序将没有另一个侦听器和WebSocket连接打开.但是,我查看了Firebase的API文档,看起来没有办法做到这一点.
我见过的大多数答案总是建议制作某种复合键/索引并使用复合键进行相应过滤,但这只适用于搜索范围.或者他们建议只是嵌套数据而不用担心冗余和磁盘空间(并且更快),而不是通过外键检索关联数据.
但是,问题是我使用的是Geofire,它的查询方法只返回项目的键,而不是项目的数据.所有的文档和以前的答案会建议检索数据或者通过实时SDK,我已经通过尝试一次法或制作REST调用的所有项目和过滤用orderBy,startAt,endAtPARAMS和过滤由本地的钥匙我需要.
这可能会有效,但是检索一堆我不需要在本地过滤它们的项目的潜在开销似乎很浪费.使用once监听器的方法似乎也很浪费,因为它是每个项密钥的服务器往返.这种方法在这个相当不错的帖子中有所解释,但根据这个解释,它仍然为每个项目进行往返(即使它是异步的并且通过相同的连接).
这个可怜的灵魂问了一个类似的问题,但没有得到很多有用的答复(这真的解决了制作n服务器请求数量的成本).
有人可以一劳永逸地解释如何做到这一点以及利弊的方法吗?谢谢.
我正在使用Angular 6上的Geofire和Firebase存储位置,不幸的是它存储了大量重复项,这是一个示例(控制台记录我的变量currentHits):
0: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
1: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
2: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
3: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
4: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
5: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
6: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
7: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
8: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
Run Code Online (Sandbox Code Playgroud)
位置基本上是用于计算距离的纬度和经度数组,在id 0,1和2中它的坐标相同,3,4和5也是相同的,...
这就是我想要的:
0: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
1: {location: Array(2), …Run Code Online (Sandbox Code Playgroud) 我在android中开发出租车应用程序.我需要存储检索和更新我的出租车的位置,并使用geofire在地图上显示它.我使用firebase进行身份验证.
需要一个完整的android geofire教程,但找不到任何
我也看过SFVehicle的例子,但不太了解
任何帮助,将不胜感激!!!
android firebase android-studio geofire firebase-realtime-database
即使我明确告诉我不要,Firestore仍在从缓存中检索文档:
class MainActivity : AppCompatActivity() {
val db = FirebaseFirestore.getInstance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val dbSettings = FirebaseFirestoreSettings.Builder().setPersistenceEnabled(false).build()
db.firestoreSettings = dbSettings
Run Code Online (Sandbox Code Playgroud)
上面是我在启动器中设置Firestore设置的活动。
在我的片段中,我执行GeoFirestore GeoQuery:
class MapFragment : Fragment() {
val instances = FirebaseFirestore.getInstance().collection("instances")
val geoFirestore = GeoFirestore(instances)
lateinit var nearbyDocs: GeoQuery
private fun searchNearby(){
nearbyDocs = geoFirestore.queryAtLocation(currentLocation, 1.0)
nearbyDocs.addGeoQueryDataEventListener(object : GeoQueryDataEventListener {
override fun onDocumentEntered(documentSnapshot: DocumentSnapshot, location: GeoPoint) {
Log.d(TAG, "onDocumentEntered: user1: ${documentSnapshot.getString("user1")?.substring(0, 3)} | docId: ${documentSnapshot.id.substring(0, 5)} | fromCache: ${documentSnapshot.metadata.isFromCache}")
Log.d(TAG, "isPersistanceEnabled2: ${db.firestoreSettings.isPersistenceEnabled}")
}
} …Run Code Online (Sandbox Code Playgroud) 我试图保存位置(所以latitide和经度)作为Firebase中的键/字段之一.在他们的示例SFVehicles中,他们确实展示了如何在存储信息后进行查询,但我的问题是如何首先保存.
在他们的博客文章中,GeoFire使用Mobile,他们正在展示数据的样子 - 但我如何location填充该字段?
我可以将其他类型的字符串保存到Firebase.我只是使用下面的代码.问题是该字段应该是什么数据类型location?
Firebase ref = new Firebase("https://myfirebaselink.firebaseio.com/");
//User
alan = new User("Alan Turing", 1912);
alanRef.setValue(obj);
Run Code Online (Sandbox Code Playgroud)
我试图location成为一个List<String>,但是没有用 - 位置字段如下所示:
编辑:在更多的研究,发现谷歌的这篇博客文章,但他们也节省了latitude1 and经度. This probably was written beforeGeoFire`的关键经验.
如何GeoLocation(double lat, double lng)使用地理查询获取接近传递的所有位置.我有以下代码(它没有发生):
public void setCurrentLatLng(double lat, double lng){
this.lat = lat;
this.lng = lng;
GeoLocation geoLocation = new GeoLocation(lat, lng);
updateCurrenLocation(geoLocation);
GeoQuery geoQuery = geoFire.queryAtLocation(geoLocation, 8f);
geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
@Override
public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {
Log.d("geoQuery","onDataEntered "+dataSnapshot.toString());
// ...
}
@Override
public void onDataExited(DataSnapshot dataSnapshot) {
Log.d("geoQuery","onDataExited "+dataSnapshot.toString());
// ...
}
@Override
public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {
Log.d("geoQuery","onDataMoved "+dataSnapshot.toString());
// ...
}
@Override
public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) { …Run Code Online (Sandbox Code Playgroud) 我在Rideshare应用程序中使用Firebase数据库,我正在尝试将代码转储到设备中,它向我显示文件未找到例外,其中Jackson数据绑定库文件未在构建时集成.我需要清理它和gradle运行它10或15次然后它安装一次.我正在将Firebase数据快照转换为我的代码中的自定义java对象,并且Jackson库文件丢失,最终映射失败.尝试删除传统的Api,只是再次看到它崩溃.有人帮助我.
这是我一直得到的错误:
错误:在最新检查期间无法捕获任务'transformClassesWithDexForDebug'的输出文件的快照.
java.io.FileNotFoundException:D:\ FirebaseDBTesting\app\build\intermediates\transforms\dex\debug\folders\1000\10\jackson-databind-2.2.2_502dac698d8ab87b5c73024fb2c1baa4c979a770\classes.dex(系统找不到指定的文件)
这是我的gradle文件:
apply plugin: 'com.android.application'
android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/license.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/notice.txt'
}
compileSdkVersion 23
buildToolsVersion "24.0.3"
defaultConfig {
applicationId "com.example.xinthe.firebasedbtesting"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
dexOptions {
javaMaxHeapSize "4g"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', …Run Code Online (Sandbox Code Playgroud) geofire ×10
firebase ×9
android ×7
javascript ×2
angular ×1
build.gradle ×1
geofencing ×1
google-maps ×1
java ×1
kotlin ×1
rest ×1