【问题标题】:How to get all rows from a table in Firebase synchronously?如何同步从 Firebase 中的表中获取所有行?
【发布时间】:2018-02-01 09:00:24
【问题描述】:

考虑下面的sn-p代码:

public ArrayList<GenericModel> getList(GenericModel model) {
    ValueEventListener postListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList<GenericModel> genericModels = new ArrayList<>();

            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                GenericModel genericModel = postSnapshot.getValue(model.getClass());
                genericModels.add(genericModel);
            }
            Collections.sort(genericModels, (o1, o2) -> o1.getDate().compareTo(o2.getDate()));

            return genericModels;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            return null;
        }
    };
    mDatabase.child(model.getTableName()).child(mUser.getUid()).addListenerForSingleValueEvent(postListener);
}

目前这段代码不起作用,我只能通过回调来解决这个问题。我不希望那样。我想要一个返回 ArrayList 的方法。我怎么能重写这个?使用 Kotlin 也是一种选择。

【问题讨论】:

  • 发布你的数据库截图!
  • 亲爱的 Rahul,问题是如何使用返回 ArrayList 的方法对其进行重新编程。代码在回调中运行良好。你想让我发布回调代码吗?
  • 我将发布我的代码以检索所有行
  • Firebase API 并非旨在同步工作。您应该使用异步编程来处理它。还要记住,阻塞应用程序的主线程是一个非常糟糕的主意。

标签: android firebase firebase-realtime-database kotlin synchronous


【解决方案1】:
public Task<ArrayList<GenericModel>> getList(GenericModel model) {
    if (!mIsInitialized) {
        initialize();
    }

    final TaskCompletionSource<ArrayList<GenericModel>> tcs = new TaskCompletionSource<>();

    if (mIsInitialized) {
        ValueEventListener postListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<GenericModel> genericModels = new ArrayList<>();

                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    GenericModel genericModel = postSnapshot.getValue(model.getClass());
                    genericModels.add(genericModel);
                }
                Collections.sort(genericModels, (o1, o2) -> o1.getDate().compareTo(o2.getDate()));

                tcs.setResult(genericModels);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                tcs.setResult(null);
            }
        };

        mDatabase.child(model.getTableName()).child(mUser.getUid()).addListenerForSingleValueEvent(postListener);

    }
    return tcs.getTask();
}

这里是调用方法:(Kotlin, with co-routines)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    doAsync {
        val task = FirebaseManager.getInstance().getList(FixedCosts())
        task.addOnCompleteListener {
            uiThread {
                if (task.result != null) {
                    //show the result in UI 
                }
          }
      }
}

【讨论】:

    【解决方案2】:

    在这段代码中,我正在检索该节点中所有可用的行:

    //全局变量\ ArrayList arrayListEventName = new ArrayList();

    public ArrayList<String or Pojo>getEventNames() {
            progressDialog();
            //----Shared Preference----\\
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            String emailId = prefs.getString(StaticValues.PREF_EMAIL, "name@provider,com");
            emailId = emailId.replace(".", ",");
            //--------------\\
    
            database = FirebaseDatabase.getInstance(); // Database Instance \\
            DatabaseReference databaseReference_users = database.getReference("admin").child(emailId)
                    .child("eventsCreated");
            databaseReference_users.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
    
                @Override
                public void onDataChange(final com.google.firebase.database.DataSnapshot dataSnapshot) {
                    arrayListEventName.clear();
    
                    for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                        String eventName = (String) postSnapshot.child("eventName").getValue(String.class).toLowerCase();
    //                    if(eventName.equals(eventName2)){
    //
    //                    }
                        arrayListEventName.add(eventName);
                    }
    
                    dismissDialog();
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
    

    返回数组列表事件名称;

        }
    

    截图:

    【讨论】:

    • 这并不能解决问题,因为我需要一个返回 ArrayList 的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多