2016-06-02 4 views
0

Я написал код, который извлекает данные из базы данных firebase.Мой код извлекает данные только из первого поля моей базы данных. См. Подробности

Проблема в том, что мой код извлекает данные только из самого первого поля данных в моей базе данных, а не из всех полей.

Я хочу, чтобы он извлекал данные из каждого поля моей базы данных.

Вот мой код:

retrieveRef = new Firebase("https://appname.firebaseio.com/hDetails/"); 

retrieveRef.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     hDescription = (String) dataSnapshot.child("hDescription").getValue(); 
     hImage = (String) dataSnapshot.child("hImage").getValue(); 
     hLat = (String) dataSnapshot.child("hLat").getValue(); 
     hLng = (String) dataSnapshot.child("hLng").getValue(); 
     postedAtTime = (String) dataSnapshot.child("postedAtTime").getValue(); 
     postedBy = (String) dataSnapshot.child("postedBy").getValue(); 
     postedOnDate = (String) dataSnapshot.child("postedOnDate").getValue(); 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 

    } 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 
     Toast.makeText(getBaseContext(), firebaseError.getMessage(), 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

Вот образ моей базе данных:

enter image description here

Данные получать извлекаются только из самого последнего поля, т.е. f4452618-a073-4868-a9c6-050b055b4861 каждый раз.

Вот build.gradle (модуль: приложение):

apply plugin: 'com.android.application' 

    android { 

     compileSdkVersion 23 
     buildToolsVersion "23.0.2" 
     defaultConfig { 
      applicationId "com.abc.xyz" 
      minSdkVersion 16 
      targetSdkVersion 23 
      versionCode 5 
      versionName "0.4" 
      multiDexEnabled true; 
     } 
     packagingOptions { 
      exclude 'META-INF/LICENSE' 
      exclude 'META-INF/LICENSE-FIREBASE.txt' 
      exclude 'META-INF/NOTICE' 
     } 
     buildTypes { 
      release { 
       minifyEnabled false 
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
       signingConfig signingConfigs.config 
      } 
     } 
    } 

    dependencies { 
     compile fileTree(dir: 'libs', include: ['*.jar']) 
     testCompile 'junit:junit:4.12' 
     compile 'com.android.support:appcompat-v7:23.4.0' 
     compile 'com.android.support:design:23.4.0' 
     compile 'com.android.support:cardview-v7:23.4.0' 
     compile 'com.android.support:recyclerview-v7:23.4.0' 
     compile 'com.firebase:firebase-client-android:2.3.1' 
     compile 'com.firebaseui:firebase-ui:0.3.1' 
     compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
     compile 'com.google.android.gms:play-services-maps:9.0.0' 
     compile 'com.google.android.gms:play-services-plus:9.0.0' 
     compile 'com.android.support:support-v4:23.4.0' 
     compile 'com.squareup.picasso:picasso:2.5.2' 
     compile 'com.google.android.gms:play-services-location:9.0.0' 
     compile 'com.firebase:geofire:1.1.0' 
     compile 'com.google.firebase:firebase-database:9.0.1' 
     compile 'io.github.yavski:fab-speed-dial:1.0.4' 
     compile 'com.google.gms:google-services:3.0.0' 
    } 

apply plugin: 'com.google.gms.google-services' 

Вот buid.gradle (проект: имя_проекта):

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.0' 
     classpath 'com.google.gms:google-services:3.0.0' 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

Что происходит здесь не так?

Пожалуйста, дайте мне знать.

Извините, если вопрос кажется плохо отформатированным. Я все еще новичок.

ответ

0

Попробуйте использовать класс Query из Firebase

DatabaseReference root = FirebaseDatabase.getInstance(). 
getReferenceFromUrl("https://appname.firebaseio.com/hDetails/"); 

Query playlistQuery = root.orderByKey(); 

playlistQuery.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) 
      { 

       //Make sure you have a empty constructor to de-serialize it 

       YourPOJO playlist = dataSnapshot.getValue(YourPOJO.class); 
       playlist.getName(); // Depends on the field names 
       playlist.getDetails(); 
       .... 
      } 
      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
+0

Что такое 'DatabaseReference' и' FirebaseDatabase' здесь? –

+0

Прочтите https://firebase.google.com/support/guides/firebase-android#fix_your_class_references_numbered –

+0

, но почему я не могу импортировать их в свой проект? В нем говорится: «Невозможно разрешить метод« DatabaseReference »или« FirebaseDatabase ». –

0

Это будет получать список hDetails:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference retrieveRef = database.getReference("hDetails"); 
    final List<YourPOJO> pojoList = new ArrayList<>(); 
    retrieveRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      pojoList.clear(); 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       pojoList.add(snapshot.getValue(YourPOJO.class)); 
      } 

     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      Toast.makeText(getBaseContext(), firebaseError.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

Зависимости добавить на Top build.gradle уровня:

dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.0' 
     classpath 'com.google.gms:google-services:3.0.0' 
    } 

App level build.gradle:

dependencies { 
    compile 'com.google.firebase:firebase-core:9.0.0' 
    compile 'com.google.firebase:firebase-auth:9.0.0' 
    compile 'com.google.firebase:firebase-database:9.0.0' 
} 
apply plugin: 'com.google.gms.google-services' 
+0

И, похоже, вы используете более старую версию Firebase. Попробуйте использовать более новую версию - https://firebase.google.com/docs/android/setup. – Selvakumar

+0

, пожалуйста, просмотрите отредактированный вопрос. Я добавил файлы build.gradle. –

+0

что это за ошибка: 'Caused by: java.lang.RuntimeException: классы Android не найдены. Вы используете артефакт firebase-client-android? 'В этой строке' Firebase.setAndroidContext (this); '? –