2017-05-05 47 views
-2

我是新的使用火力點,我不知道如何從我的數據庫獲取一個String如何從android工作室上的firebase獲取字符串?

我的數據庫

enter image description here

我想寫獲取用戶ID的功能,返回他的名字。我嘗試了很多東西,但沒有成功。有人可以給我這個功能,或告訴我如何寫它?

這是我的嘗試:

public void checkFunction() { 

    final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef = database.getReference("Users").child("0"); 

    ValueEventListener UserFromID = new ValueEventListener() { 

    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     return dataSnapshot.getValue().toString(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 

    }; 

    myRef.addValueEventListener(UserFromID); 
} 

但我得到以下錯誤

無法從法無效結果類型返回一個值

+0

請將您的代碼發送 –

+0

請讓我們知道您嘗試了什麼 – FaisalAhmed

+0

哪一個是用戶ID? –

回答

-1
  1. 第一所有從您的項目設置中下載google-services.json文件。

  2. 將其粘貼到應用程序的應用程序目錄中。

  3. 在您想要檢索數據的onCreate或函數中編寫以下代碼。

    private DatabaseReference mDatabase; // ... mDatabase = FirebaseDatabase.getInstance()。getReference();

    //讀取值 ValueEventListener postListener =新ValueEventListener(){ @覆蓋 公共無效onDataChange(DataSnapshot dataSnapshot){// 後獲取對象,並使用這些值來更新UI 後後= dataSnapshot.getValue (「用戶名」); // ... }

    @覆蓋 公共無效onCancelled(DatabaseError databaseError){// 獲取失敗後,記錄消息 Log.w(TAG, 「loadPost:onCancelled」,databaseError.toException( )); // ... } }; mPostReference.addValueEventListener(postListener);

+0

我試過了,但是我不想使用post類,我只想得到一個字符串,而且它不會忽略'getValue(「用戶」)''。 –

+0

用戶是json的jsonobject,上面的代碼正在工作。我正在從最後1年開始工作yeae –

+0

Threre是一個沒有使用Post類的解決方案嗎? –

0

理想情況下,我們需要更多地瞭解您正在嘗試做什麼。

應用程序的用戶是否可以訪問所有這些用戶ID?還是應該只能訪問自己的?他們是管理員,還是最終用戶等?

當你說「一個獲取用戶ID的函數」時,你的意思是你提供了這個ID,並且該函數返回該用戶ID中該人的名字?另外,在這種情況下,您正在對用戶標識進行硬編碼。這僅僅是爲了測試嗎? 您是否在使用Firebase Auth進行用戶註冊等,或者沒有註冊?

很難在不知道更多的情況下回答這個問題,但讓我們假設用戶從Firebase獲取任何字符串的最新消息。 (如果使用Firebase身份驗證,則DatabaseReference略有不同)

因此,您需要一個映射到樹中正確節點的DatabaseReference。在你的例子中,用戶將無法訪問用戶1和2.(這是你想要的嗎?)。在我的示例中,他們可以訪問0,1和2.

現在,您只需將偵聽器添加到您正在查找的數據庫引用的子級。在下面的情況下,我們要求具有「0」鍵的值。

public void checkFunction() { 

    private FirebaseDatabase mRef; 
    //String variable to store whatever value we're looking for 
    String mName = ""; 

    //Our reference knows only "Users" and all of its children 
    mRef = FirebaseDatabase.getInstance().getReference().child("Users"); 

    //Adding a listener for the value associated with the user key "0" 
    mRef.child("0").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      //In this case, "shalom" will be stored in mName 
      mName = (String) snapshot.getValue(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

希望這可以讓我們更容易理解發生了什麼。

在不知情的情況下很難回答這個問題,但我懷疑你需要重新考慮數據庫的結構。也許更符合下面的結構,其中RandomUserIdsHere是在使用Firebase身份驗證註冊時分配給每個用戶的自動生成的uids。

todofirebaseapp-4c83d{ 
       "Users" :{ 
        "*RandomUserIdsHere*" : { 
         "FirstName" : "Joe", 
         "LastName" : "Bloggs", 
          "Age" : "30" 
        } 
        "*AnotherRandomUserIdsHere*" : { 
         "FirstName" : "Jane", 
         "LastName" : "Doe", 
          "Age" : "21" 
        } 
        "*AnotherRandomUserIdsHere*" : { 
         "FirstName" : "John", 
         "LastName" : "Doe", 
          "Age" : "47" 
        } 
       } 

} 

在這種情況下,DatabaseReference看起來有點不同。我們會像這樣通過uid。

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid; 
mRef = FirebaseDatabase.getInstance().getReference("todofirebaseapp-4c83d").child("Users").child(uid); 

編輯:改正我無法SPEL。

+0

首先,我很抱歉,我的問題沒有太多細節,所有這些東西都是新的,我希望我的下一個問題能更好地寫出來。你問什麼即時通訊嘗試做,但即時通訊只是試圖回想一個單一的字符串這個小東西。同樣在你的解決方案中,我正在與從onDataChange中獲取String的問題進行鬥爭,因爲它說「varieble'mName'是從內部類訪問的,需要聲明爲final」。我不能添加到mName final,或者當我嘗試執行getValue時,它會對我造成錯誤。你能幫我解決這最後一件事嗎? –

+0

嗨,你不需要把它分配爲最終。在類的頂部創建它並聲明爲私有字符串。 我將它包含在示例代碼中,以便您瞭解發生了什麼,因爲我認爲可能不清楚我是否讓您假設它應該是類可訪問的變量。 數據庫引用也應該在類的頂部創建,而不是在函數/方法內部創建。 – Spectre

相關問題