2017-05-05 122 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

相关问题