【发布时间】:2021-05-15 16:37:57
【问题描述】:
我是 Java 编码的新手。目前,我正在尝试从我的 firebase 实时数据库中获取“特定”数据。就我而言,我想使用 UserID 来获取 HostID 中的纬度和经度。但是,我无法获取来自不同帐户的数据。我对我的问题做了一些研究。还是不知道在使用UserID时如何获取HostID中的经纬度。
以下是我如何将数据存储到数据库中。
private void saveDatatoDatabase(Location location) {
String latitude = String.valueOf(location.getLatitude());
String longitude = String.valueOf(location.getLongitude());
//Access to database
rootNode = FirebaseDatabase.getInstance();
reference = rootNode.getReference("HostID");
//Get the lat and log to the database
TrackingIDClass IDclass = new TrackingIDClass(latitude, longitude);
reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("TrackingID").child("ID").setValue(IDclass);
}
这是我的数据库数据。
这是我使用同一个主机帐户检索数据的方法。
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//LatLng sydney = new LatLng(-34,151);
// LatLng lastLocationPlaced = sydney;
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("HostID")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("TrackingID").child("ID");
ValueEventListener listener = databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String latitude = dataSnapshot.child("latitude").getValue(String.class);
String longitude = dataSnapshot.child("longitude").getValue(String.class);
Double Latitude = Double.parseDouble(latitude);
Double Longitude = Double.parseDouble(longitude);
LatLng latLng = new LatLng (Latitude,Longitude);
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Lat:" + Latitude+" Lon:" + Longitude);
mMap.addMarker(markerOptions);
//lastLocationPlaced = latLng;
mMap.animateCamera((CameraUpdateFactory.newLatLngZoom(latLng,12.0f)));
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
现在,当我使用 UserID 帐户时,我在获取纬度的过程中遇到了问题。我真的不确定如何从这里开始,我看不到任何前进的方法。请指教。非常感谢。
更新!!!
现在我对 TrackingID 的搜索方式做了一些更改。
private void isTrackingID() {
String userTrackingID = enterTracking.getText().toString().trim();
//Long userTrackingIDNumber = Long.parseLong(userTrackingID);
Toast.makeText(this, "testing = " + userTrackingID, Toast.LENGTH_SHORT).show();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("HostID").child(firebaseAuth.getUid());
Query query = reference.orderByChild("TrackingID/ID").equalTo(userTrackingID);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Log.i("checking", "this is value message");
enterTracking.setError(null);
String IDfromDatabase = dataSnapshot.child(userTrackingID).getValue(String.class);
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
String Latitudevalue = String.valueOf(dataSnapshot1.child("latitude").getValue());
Log.i("testing for lol", Latitudevalue);
String Longitudevalue = String.valueOf(dataSnapshot1.child("longitude").getValue());
Log.i("testing for latitude", Longitudevalue);
String latitudefromDatabase = dataSnapshot1.child("latitude").getValue(String.class);
String longitudefromDatabase = dataSnapshot1.child("longitude").getValue(String.class);
Double Latitude = Double.parseDouble(latitudefromDatabase);
Double Longitude = Double.parseDouble(longitudefromDatabase);
Intent intent = new Intent(Latitude_Longitude.this, MapsActivity.class);
intent.putExtra("latitude", Latitude);
intent.putExtra("longitude", Longitude);
startActivity(intent);
}
}else {
enterTracking.setError("Invalid Tracking ID from database");
enterTracking.requestFocus();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("error", databaseError.getMessage());
}
});
}
添加这些代码后,logcat 一直显示“W/PersistentConnection: pc_0 - 使用未指定的索引。您的数据将在客户端下载和过滤。考虑添加 '".indexOn": "TrackingID/ID"' HostID/q6jJMcxtTxMkxiktl6K4eDBSrRP2 到您的安全和 Firebase 数据库规则以获得更好的性能”和 Edittext 的输出一直说“来自数据库的无效跟踪 ID。”不知道哪里错了……
【问题讨论】:
-
您需要在 Firebase 控制台中调整您的数据库规则以允许访问其他用户的数据。
-
@Cole Tustin 我应该如何调整数据库规则以及在不知道 HostID 的 UID 的情况下如何获取位置?
-
首先,停止忽略错误。使用
Log.d(TAG, databaseError.getMessage());。您是否在 logcat 中打印了一些内容?除此之外,这段代码中究竟有什么不能按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?请回复@AlexMamo -
我已经使用了 Log.d(TAG , databaseError.getMessage());已经,但是android studio说TAG字有错误,需要采取措施....
标签: java android firebase firebase-realtime-database