关于android-从简单的FireBase数据库读取和android读取数据库数据的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于androidstudiofirebase数据库:如何从
关于android-从简单的FireBase数据库读取和android读取数据库数据的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android studio firebase数据库:如何从子子获取数据、android – Firebase数据库 – 如何执行前缀通配符查询、android – Firebase数据库依赖崩溃了应用程序、android – Firebase数据库带宽计算等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- android-从简单的FireBase数据库读取(android读取数据库数据)
- android studio firebase数据库:如何从子子获取数据
- android – Firebase数据库 – 如何执行前缀通配符查询
- android – Firebase数据库依赖崩溃了应用程序
- android – Firebase数据库带宽计算
android-从简单的FireBase数据库读取(android读取数据库数据)
从Firebase数据库读取时遇到一些问题.
我有一个非常简单的布局
{
"lot" : {
"lot1" : "low",
"lot2" : "low",
"lot3" : "low"
}
}
当然,MyAppName {}最重要.
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getInstance().getReference();
// Read from the database
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
lotMap = (HashMap) dataSnapshot.getValue();
Log.d("[Directions Activity]: ", "Lot1 value ====== " +lotMap.get("lot"));
Iterator it = lotMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
Log.d("[Directions Activity]: ", "iterator " + pair.getKey() + " = " + pair.getValue());
System.out.println();
it.remove(); // avoids a ConcurrentModificationException
}
}
这是日志返回的内容
D/[Directions Activity]:: Lot1 value ====== null //null obvIoUsly
//because key lot1 doesn't exist
D/[Directions Activity]:: lot = {lot3=low, lot2=low, lot1=low}
因此,对我来说,它似乎正在返回字符串{lot3 = low,lot2 = low,lot1 = low},但我希望能够获得一个数组,并在可能的情况下使用每个值.
这可以实现吗?
解决方法:
您的代码中有一些调整.你的
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getInstance().getReference();
应该这样写
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference database = myRef.child("anyValueNameYouSpecifyInConsole");
这两行应在onCreate方法外部声明.您需要使用addValueEventListener指定的一个是第二个DatabaseReference,而不是第一个.因此,在我的示例中应该看起来像这样,
database.addValueEventListener (new ValueEventListener)
它将导入方法.
如果您希望数据显示在特定的TextView中,则只需找到要使用的TextView的findViewById并将其包含在onDataChange方法中,就像这样,
String x = dataSnapshot.getValue(String.class);
textViewNameDeclared.setText(x);
并且不要忘记更改安全规则以进行阅读.
android studio firebase数据库:如何从子子获取数据
您快到了。您只需要一个额外的循环,即可满足JSON中未知密钥的额外需求:
private void showbumps() {
ref =FirebaseDatabase.getInstance().getReference().child("SpeedBump");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
List<SpeedBump> bumps = new ArrayList<>();
bumps.clear();
for (DataSnapshot locationSnapshot: snapshot.getChildren()) {
for (DataSnapshot bumpSnapshot: locationSnapshot.getChildren()) {
SpeedBump bump = bumpSnapshot.getValue(SpeedBump.class);
...
我发现为快照变量赋予清晰的名称以指示它们捕获的数据的哪一部分最有用。
android – Firebase数据库 – 如何执行前缀通配符查询
我想在Firebase数据库上执行通配符查询,
并且不知道图书馆是否支持这一点. – (我猜它没有.)
我想要一个网络流量尽可能少的最佳解决方案,假设数据集是数百万条记录.
数据集(使用前缀通配符):
user_id:
id_001123:
name: "java"
id_002124:
name: "objective-c"
id_003125:
name: "swift"
代码如何使用通配符检索记录id_002124名称字段,您只有一部分ID.例如. “?4”.
预期结果为id_002124,名称为“objective-c”
任何移动语言示例代码都很棒.
(目标C /夫特/爪哇)
解决方法:
Firebase数据库查询可以根据对象的键(例如id_001123),它们的值(在您的情况下不适用)或子属性的值(例如,name =“java”)来排序/过滤数据.
对于每个Firebase,可以匹配具有您指定的特定值的项目,从您指定的值开始的项目,或以您指定的值结束的项目.
因此,您可以创建一个与名为objective-c的项匹配的查询:
ref.child("user_id").orderByChild("name").equalTo("objective-c")
或者,您可以创建与id_001124和id_001125匹配的查询:
ref.child("user_id").orderByKey().startAt("id_001125")
或者只是获取以id_0011开头的所有项目:
ref.child("user_id").orderByKey().startAt("id_0011")
或者,您可以创建一个与id_001123和id_001124匹配的查询:
ref.child("user_id").orderByKey().endAt("id_001124")
Firebase数据库无法根据值的结尾进行过滤.因此,您当前的数据结构中无法获得其键以4结尾的所有项目.
请在此处阅读有关Firebase数据库查询的更多信息:https://firebase.google.com/docs/database/android/lists-of-data#sorting_and_filtering_data
并查看有关搜索FirebaseL的许多先前问题
> How to perform sql “LIKE” operation on firebase?
> Firebase query – Find item with child that contains string
> Firebase “like” search on string
android – Firebase数据库依赖崩溃了应用程序
我正在尝试使用以下“Set up Firebase Realtime Database for Android”示例写入我的数据库,但应用程序在启动时崩溃.
这似乎是因为依赖:
compile 'com.google.firebase:firebase-database:9.2.1'
崩溃日志:
FATAL EXCEPTION: main
Process: com.example.giat.myapplication, PID: 3874
java.lang.NoSuchMethodError: No static method zzeq(Landroid/content/Context;)Lcom/google/android/gms/internal/zzalp; in class Lcom/google/android/gms/internal/zzalp; or its super classes (declaration of 'com.google.android.gms.internal.zzalp' appears in /data/data/com.example.giat.myapplication/files/instant-run/dex/slice-com.google.firebase-firebase-database-9.2.1_b22e7bdbdba6ace0ee1e94f163c76d1f75b59f7e-classes.dex)
at com.google.firebase.FirebaseApp.initializeApp(UnkNown Source)
at com.google.firebase.FirebaseApp.initializeApp(UnkNown Source)
at com.google.firebase.FirebaseApp.zzek(UnkNown Source)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(UnkNown Source)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1702)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1665)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(UnkNown Source)
at android.app.ActivityThread.installProvider(ActivityThread.java:5417)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4988)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4923)
at android.app.ActivityThread.access$1500(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
MY App build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsversion "24.0.1"
defaultConfig {
applicationId "com.example.giat.myapplication"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile filetree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.google.firebase:firebase-core:9.4.0'
compile 'com.google.firebase:firebase-database:9.2.1'
}
apply plugin: 'com.google.gms.google-services'
如何解决这个问题?
解决方法:
此问题是由使用不一致的Firebase库版本引起的.更新构建依赖项以始终使用版本9.4.0.
compile 'com.google.firebase:firebase-core:9.4.0'
compile 'com.google.firebase:firebase-database:9.4.0'
android – Firebase数据库带宽计算
该应用程序是一个众包汽油价格的应用程序.用户可以在特定站点输入汽油价格,同意所述价格的其他用户可以“喜欢”它.更新价格后,重置“喜欢”计数.
打开应用程序后,它会向附近的加油站(最多20个站点)查询Google Places API Web服务.通过它,它将监听器挂钩到Firebase数据库中的站点数据.每个站的数据结构如下所示.
prices{ ChIJpXJ4phI4zDERJqFTBzawpXk={ placeID='ChIJpXJ4phI4zDERJqFTBzawpXk',company=500,lat=3.2095573,lng=101.7185698,name='Shell Malaysia (Iznora Enterprise)',firebaseID='xxx',userName='xxx',time=1491833181946,ron95=2.0,ron97=1.7,diesel=2.0,isValid=true } }
为了跟踪喜欢的内容,有一段数据为
likes{ ChIJpXJ4phI4zDERJqFTBzawpXk={ firebaseID1=true,firebaseID2=true,firebaseID3=true } }
我读了我们可以使用的Firebase database bandwidth usage when read with Query(Firebase.getDefaultConfig().setLogLevel(Level.DEBUG))进行流量检查,但我没有看到任何关于logcat上传和下载带宽的内容.只有这样……
04-10 22:39:19.250 3015-3192/? D/RepoOperation: onDataUpdate: /prices/ChIJpXJ4phI4zDERJqFTBzawpXk 04-10 22:39:19.250 3015-3192/? D/RepoOperation: onDataUpdate: /prices/ChIJpXJ4phI4zDERJqFTBzawpXk {time=1491833181946,firebaseID=xxx,valid=true,diesel=2,ron97=1.7000000476837158,ron95=2,placeID=ChIJpXJ4phI4zDERJqFTBzawpXk,name=Shell Malaysia (Iznora Enterprise),userName=xxx,lng=101.7185698} 04-10 22:39:19.268 3015-3015/? D/EventRaiser: Raising /prices/ChIJpXJ4phI4zDERJqFTBzawpXk: VALUE: {time=1491833181946,lng=101.7185698} 04-10 22:39:19.273 3015-3015/? D/EventRaiser: Raising /likes/ChIJpXJ4phI4zDERJqFTBzawpXk: VALUE: null
最后,我使用Android Device Monitor检查每个操作的流量.以下是Firebase的平均结果.谷歌地图和其他http查询不包括在内.
+----------------------------+-----------+-----------+-----------------------------------------+ | Action | Rx(bytes) | Tx(bytes) | Notes | +----------------------------+-----------+-----------+-----------------------------------------+ | onPause | 2942 | 4680 | detach all listeners | | onResume | 10143 | 5204 | reattach all listeners for 15 stations | | click "like" by self | 620 | 535 | write action + download /likes/placeID | | update price by self | 1642 | 1783 | write action + download /places/placeID | | click "like" by other user | 382 | 112 | download /likes/placeID | | update price by other user | 423 | 104 | download /places/placeID | +----------------------------+-----------+-----------+-----------------------------------------+
在我关闭应用程序之前,我在数据库中有5.7MB的数据.我可以保证我将每个站点的监听器直接连接为/ prices / placeID,因此我没有检索整个“站”数据,而只检索该特定站的数据.同样对于“喜欢”.听众也在onPause上分离.
我没有任何可用的用户操作日志,因此我很难追溯发生的事情.但是,每当用户打开应用程序时,都必须查询Google Place API,因此我知道在3天内,我有245k个查询.因此对于每个用户会话.
117GB / 245k session = ~480kB/session
这似乎很大.我对带宽等没有经验,所以我可能错了.即使我假设所有用户都做了下面极不可能的操作,我仍然无法填满带宽.
+----------------------------+-----------+-------+--------------+----------------------------------------------------------+ | Action | Rx(bytes) | Times | Total(bytes) | Notes | +----------------------------+-----------+-------+--------------+----------------------------------------------------------+ | onPause | 2942 | 10 | 29420 | Pause and resume 10 times,this does not update the map. | | onResume | 10143 | 10 | 101430 | | | click "like" by self | 620 | 15 | 9300 | Click like on all 15 stations | | update price by self | 1642 | 15 | 24630 | Update price on all 15 stations | | click "like" by other user | 382 | 100 | 38200 | 100 other users clicked per session | | update price by other user | 423 | 100 | 42300 | 100 other users updated the price per session | | Total | | | 245280 | | +----------------------------+-----------+-------+--------------+----------------------------------------------------------+
对于普通用户,我预计每个会话最多只能达到50kB,因此Firebase似乎消耗了x10的带宽.所以我的问题:
>我是否对每个会话的带宽进行了计算?
>使用Android设备监视器确定的流量是否正确?我错过了什么吗?有更好的检查方法吗?
> Firebase如何计算带宽?它还包括上传吗?有隐藏的带宽吗?
对不起,很长的帖子.感谢有人可以提供帮助.
谢谢.
解决方法
Query priceQuery = getPricesRef().orderByChild("firebaseID").equalTo(myFirebaseID);
这是我噩梦的开始因为我没有为该数据库设置.indexOn.阅读官方Firebase文档here.有关Query的文档很差.它只表明在没有索引的情况下性能会很差,但从未提及带宽:
基于上述声明,我的假设是,如果没有.indexOn,对Firebase的查询可能需要更长时间才能回复,因为Firebase服务器可能需要更长时间才能提供搜索结果.
但是,正如Firebase database bandwidth usage when read with Query所述,整个数据库首先从Firebase下载,然后在客户端进行排序和查询!我想这就是实时客户端库可以在不指定索引的情况下执行即席查询的含义.
随着我的数据库的增长,每个用户注册通过下载整个价格数据库开始消耗更高的带宽.最后,仅仅注册就消耗了大约800kB的用户.因此,请务必始终使用.indexOn!
关于android-从简单的FireBase数据库读取和android读取数据库数据的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android studio firebase数据库:如何从子子获取数据、android – Firebase数据库 – 如何执行前缀通配符查询、android – Firebase数据库依赖崩溃了应用程序、android – Firebase数据库带宽计算等相关内容,可以在本站寻找。
本文标签: