【问题标题】:Firebase retrieve array name and array with authenticationFirebase 通过身份验证检索数组名称和数组
【发布时间】:2018-02-12 21:02:18
【问题描述】:

我将如何实现基于帐户的数组的检索,目前当我运行以下代码时,它不会检索任何内容。我是一个完整的初学者,我尝试查看其他示例,但我的示例与其他示例不同。我的目标是检索属于该用户的所有数组。现在我只想返回这些项目的名称,但后来我也想使用数组,所以第一个用户会有:

Fruit = ["apple", "banana", "mango" ]
Veg = ["tomato", "potato", "cabbage" ]

代码:

public class HomeActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{

private ZXingScannerView scannerView;
private final int permission_code = 1;

String [] selectedProfile;
Spinner spinner;
ArrayAdapter<CharSequence> adapter;

ListView lvProfiles;


private String userID;
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = mFirebaseDatabase.getReference();
    FirebaseUser user = mAuth.getCurrentUser();
    userID = user.getUid();

    if(mAuth.getCurrentUser() == null){
        finish();
        startActivity(new Intent(this, MainActivity.class));
    }

    startSpinner();

    lvProfiles = (ListView)findViewById(R.id.lvProfiles);

    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.
            showData(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

private void showData(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()){
        String x = ds.child("users").child(userID).getValue(String.class);

        ArrayList<String> array  = new ArrayList<>();
        array.add(x);
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
        lvProfiles.setAdapter(adapter);
    }
}

我的数据库是这样的:

{
  "users" : {

"9kV3otdvOXU0CGMZWIIxggrBrj63" : {

  "Fruit" : [ "apple", "banana", "mango" ],
  "Veg" : [ "tomato", "potato", "cabbage" ]
},
"FKazRnUjrzMuQs6dbeIIGaGju5W2" : {

  "Gluten" : [ "123", "456", "789" ]
},
"xaLZIfNudthJ8BuY6WBqYrrYPsA2" : {

  "Berries" : [ "strawberry", "raspberry", "blackberry", "blueberry", "gooseberry" ],
  "Cheese" : [ "feta", "mozzarella", "cheddar" ],
  "Kiwi" : [ "kiwi" ]
}
  }
}

更新: 我按照您的建议进行了更改,但微调器中没有出现“水果”和“蔬菜”,您有什么建议吗?这是新代码。

private void showData(DataSnapshot dataSnapshot) {

    Map<String,Object> map = dataSnapshot.child("users").child(userID).getValue(Map.class);
    ArrayList<String> array  = new ArrayList<>();
    for (Map.Entry<String,Object> entry : map.entrySet()) {

        // key contains "Fruit" or "Veg"
        String key = entry.getKey();
        // value is the corresponding list
        Object value = entry.getValue();
        array.addAll((ArrayList) value);

    }
    ArrayAdapter adapterUser = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
    spinnerUser.setAdapter(adapterUser);

}

规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

【问题讨论】:

  • 一个单独的问题,user.getUid() 在用户被检查为空之前被调用。看起来你将来会有一个空指针异常。
  • 另外,在初始化时将数据库引用指向特定位置,不要只指向 root 或“用户”,否则你会抓住一切。不要在循环中初始化 arraylists,arraylist 将被清空并在每次迭代时重新创建。当使用像微调器这样的列表视图类型的项目时,在 oncreate 中做适配器的东西,然后当你填充你的“数组”变量时,调用 adapter.notifyDataSetChanged();否则每次调用 showData 时系统都会重新创建适配器对象。

标签: java android json firebase firebase-realtime-database


【解决方案1】:

有很多事情很复杂,可能没有达到你想要的效果。我认为您正在寻找能够返回每个特定用户的列表映射,然后将所有列表项收集到微调器中的东西。如果是这样,试试这个

private void showData(DataSnapshot dataSnapshot) {

   Map<String,Object> map = (Map) dataSnapshot.getValue().child("users").child(userID);
   ArrayList<String> array  = new ArrayList<>();
   for (Map.Entry<String, Object> entry : map.entrySet()) {

      // key contains "Fruit" or "Veg"
      String key = entry.getKey();
      // value is the corresponding list
      Object value = entry.getValue();
      array.addAll((ArrayList) value);

   }
   ArrayAdapter adapter = new 
       ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
   lvProfiles.setAdapter(adapter);

}

我无法对此进行测试,所以请尝试一下,让我知道发生了什么错误,我会相应地编辑答案。

【讨论】:

  • 嗨 ryan,谢谢你,我在这里收到一个错误: Map map = dataSnapshot.child("users").child(userID).getValue(Map.class); ArrayList 数组 = 新 ArrayList(); for (Map.Entry entry : map.entrySet()) { 第三行说“不兼容的类型,需要的对象,找到
  • (Map.Entry entry "不兼容的类型,需要的对象,找到
  • 将“Map map =”更改为“Map map =”。
  • 任何东西还是水果和蔬菜?
  • 谢谢你,希望你的生活一切顺利。
猜你喜欢
  • 2017-01-29
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2023-04-08
  • 1970-01-01
  • 2018-01-27
  • 2019-03-06
相关资源
最近更新 更多