【问题标题】:firebase get data as arrayfirebase 以数组形式获取数据
【发布时间】:2015-03-09 01:23:33
【问题描述】:

我正在尝试在我的 Android 应用程序中实现 firebase,我希望能够将 firebase 中的所有条目按照它们显示的顺序拉到一个字符串数组中,然后放入 ListView 这是原始 JSON:

[ 5, "quot", "waaaaa", "also a quote", "oh this one is a little longer man", "gosh really long.   wow.  im very inspired.  golly gee wiz" ]

以及我用来尝试获取它的代码:

public class MyActivity extends ListActivity {
ArrayList<String> LIST = new ArrayList<String>();
Boolean wow = true;
Context context = this;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Firebase.setAndroidContext(context);
    updateList();


}
public void makeList(ArrayList<String> input){
    setListAdapter(new ArrayAdapter<String>(this, R.layout.mylist,input));
    ListView listView = getListView();
    listView.setTextFilterEnabled(true);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // When clicked, show a toast with the TextView text
            Toast.makeText(getApplicationContext(),
                    ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
        }
    });
}
public void updateList() {

    Firebase myFirebaseRef = new Firebase("https://admin1.firebaseio.com/");
    myFirebaseRef.child("0").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            System.out.println(snapshot.getValue());
            int length = Integer.parseInt(snapshot.getValue().toString());
            Firebase myFirebaseRef = new Firebase("https://admin1.firebaseio.com/");
            for(int i=1; i<length; i++) {
                String doIt = Integer.toString(i);
                myFirebaseRef.child(doIt).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        System.out.println(snapshot.getValue());
                        LIST.add(snapshot.getValue().toString());
                    }

                    @Override
                    public void onCancelled(FirebaseError error) {
                    }
                });
            }makeList(LIST); 
        }

        @Override
        public void onCancelled(FirebaseError error) {
        }
    });

    }

}

我在想我可以将第一个(第 0 个)对象设置为条目数,然后使用 .getValue 循环遍历整个文件,但是当它运行时,我会出现内存不足异常并且应用程序强制关闭。我所确定的是,相关的 firebase 是问题所在,而不是 ListView。感谢您的任何提示。

【问题讨论】:

标签: java android firebase


【解决方案1】:

首先,您的数据存储在 JSON 数据对象中(即不是数组)。 You do not want to store sequential, numeric ids in distributed data.

要侦听第一个 n 对象,请使用 the query methodslimitToFirst

int n = 10;
String URL = "https://<your instance>.firebaseio.com";
Firebase ref = new Firebase(URL);
Query queryRef = ref.orderByKey().limitToFirst(n);
queryRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChild) {
        Map<String, String> value = (Map<String, String)snapshot.getValue();
        System.out.println(snapshot.getKey() + " was " + value.get("message"));
    }
    // ....
});

【讨论】:

  • 这是有道理的,但我收到一个错误“不是抽象的,不会覆盖 com.firebase.client.ChildEventListener 中的抽象方法 onCancelled(com.firebase.client.FirebaseError)”
  • @IambicSam 该示例中的// ... 希望您填写其余部分。覆盖的方法在the getting started topic 中介绍。
  • 我已经能够完成这项工作。我遇到的唯一问题是我试图专门为在列表视图中单击的单个项目获取 push() 键。我查看了调试信息,但没有看到存储在列表中的密钥。
  • 呃。这是糟糕的设计,imo:“特别是,如果所有键都是整数,并且对象中 0 和最大键之间的一半以上的键具有非空值,那么 Firebase 客户端会将其呈现为 ArrayList 。”这意味着:如果开发人员没有明确处理这种情况,当用户在某个时候添加另一个条目时,对象的类型可能会意外更改(从对象到数组)。数据库对象不应该仅仅因为它获得另一个孩子就改变(客户端接收的)类型!
  • 所以不要使用连续的数字ID。此外,这不是讨论设计决策的正确论坛。另外,我同意。
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
相关资源
最近更新 更多