Firebase可伸缩性 - 查询数据库与自定义对象ArrayList?

时间:2018-02-08 15:51:53

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

我不确定我是否正确理解了一些文献。 Android文档说不要创建不必要的对象。本文(Are Firebase queries scalable)提到数据库查询的可伸缩性是可以的,但我也更好地将您的查询存储到ArrayList中并搜索它而不是查询大型数据库。

在我的情况下,我正在使用适用于Android的Firebase实时数据库,我想知道我是否有一个可能有200个示例/子节点的子节点,我应该将每个这些快照放入一个模型类然后再添加那些可以在RecyclerView中显示的ArrayList中的每一个?或者我应该在字段上运行.getValue()并以另一种方式存储它们吗?

我特意查看哪个公司ID与雇主相关联,然后转到公司节点并获取该雇主的商业名称和商业城市

DB:

FirebaseDB

以下是我在活动中的代码部分:

companiesRef.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                for (DataSnapshot ds: dataSnapshot.getChildren()) {

                                    Log.i("companiesSnap", ds.toString());
                                    Log.i("KEYs", ds.getKey());
                                    companyIDKey = ds.getKey();
                                    //For each company ID in the Arraylist
                                    for (int i = 0; i < myCompanyIDsList.size(); i++) {
                                        //IF the IDs in arraylist from employee matches CompanyID from Companies node
                                        if(myCompanyIDsList.get(i).equals(companyIDKey)) {
                                            //IF THE ID matches, then get the associated company info
                                            Log.i("city", ds.child("businessCity").getValue().toString());
                                            Log.i("name", ds.child("businessName").getValue().toString());
                                            Businesses business = new Businesses(ds);
                                            myBusinessListItems.add(business);
                                            mAdapter.updateDataSet(myBusinessListItems);
                                        }
                                    }

全班:

public class BusinessesActivity extends Activity {

    private Context mContext;
    LinearLayout mLinearLayout;
    private RecyclerView mRecyclerView;
    private MyAdapterBusiness mAdapter = new MyAdapterBusiness(this);
    private RecyclerView.LayoutManager mLayoutManager;
    ArrayList<Businesses> myBusinessListItems;
    ArrayList<String> myCompanyIDsList;
    DatabaseReference employeesRefID, companiesRef;
    FirebaseDatabase database;

    String currentUser, companyIDKey;

    TextView getData;


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


        //RECYCLERVIEW STUFF
        mRecyclerView = (RecyclerView) findViewById(R.id.b_recycler_view);

        mContext = getApplicationContext(); // Get the application context

        // Define a layout for RecyclerView
        mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);        //mLayoutManager = new LinearLayoutManager(mContext);
        mRecyclerView.setLayoutManager(mLayoutManager);

        // Initialize a new instance of RecyclerView Adapter instance
        mRecyclerView.setAdapter(mAdapter);

        //ARRAY List to Store EACH Company ID
        myCompanyIDsList = new ArrayList<String>();

        myBusinessListItems = new ArrayList<Businesses>();
        currentUser =
                FirebaseAuth.getInstance().getCurrentUser().getUid();

        database = FirebaseDatabase.getInstance();

        getData = (TextView) findViewById(R.id.getData);

        companiesRef = database.getReference("Companies").child("CompanyIDs");


        final DataSnapshotCallback callback = new DataSnapshotCallback() {
            @Override
            public void gotDataSnapshot(DataSnapshot snapshot) {
                EmployeeUser employee = new EmployeeUser(snapshot);


                //myCompanyIDsList.add(employee);

                try {
                    for (DataSnapshot ds : snapshot.getChildren()) {
                        //WITHIN each UserId check the PushID
                        Log.i("TAG", "checkIfIDExists: datasnapshot: " + ds);

                        myCompanyIDsList.add(ds.getValue(EmployeeUser.class).getID());
                        Log.i("arrayList", myCompanyIDsList.toString());

                        //}
                    }

                    //GO THROUGH EACH COMPANY ID AND FIND INFORMATION
                        companiesRef.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                for (DataSnapshot ds: dataSnapshot.getChildren()) {

                                    Log.i("companiesSnap", ds.toString());
                                    Log.i("KEYs", ds.getKey());
                                    companyIDKey = ds.getKey();
                                    //For each company ID in the Arraylist
                                    for (int i = 0; i < myCompanyIDsList.size(); i++) {
                                        //IF the IDs in arraylist from employee matches CompanyID from Companies node
                                        if(myCompanyIDsList.get(i).equals(companyIDKey)) {
                                            //IF THE ID matches, then get the associated company info
                                            Log.i("city", ds.child("businessCity").getValue().toString());
                                            Log.i("name", ds.child("businessName").getValue().toString());
                                            Businesses business = new Businesses(ds);
                                            myBusinessListItems.add(business);
                                            mAdapter.updateDataSet(myBusinessListItems);
                                        }
                                    }


                                    }

                                }
                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                                Log.d("Cancelled", databaseError.toString());
                            }

                        }); //END COMPANIES EVENT LISTENER

                    //} //END FOR
                }  //END TRY

                catch (Exception e) {
                    Log.i("FNull?", e.toString());
                }

                //mAdapter.updateDataSet(myListItems);
            }
        };


        getData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                employeesRefID = database.getReference("Employees").child(currentUser).child("Companies"); //SEE HOW ADD EMPLOYEES checks
                employeesRefID.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        callback.gotDataSnapshot(dataSnapshot);
                    }


                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Log.d("Cancelled", databaseError.toString());
                    }

                }); //END EMPLOYEE EVENT LISTENER
                Log.i("OutsideEvent", myCompanyIDsList.toString());

            }
        }); //END ONCLICK
        Log.i("OutsideonClick", myCompanyIDsList.toString());
    }


    interface DataSnapshotCallback {
        void gotDataSnapshot(DataSnapshot snapshot);
    }
}

1 个答案:

答案 0 :(得分:0)

使用Firebase时减少内存使用量的技巧是仅加载要向用户显示的数据。

如果您需要一个仅包含业务名称的列表,请在数据库中创建仅包含业务名称的节点并显示该节点。这样你就可以减少带宽和使用的内存,因为你没有加载公司的其他属性。

您通常会拥有一个“主列表”,其中包含每个公司(或其他实体类型)的所有属性。然后,您可能有一个或多个“显示列表”,其中仅包含您需要在某些区域中显示的业务信息。这种重复数据在NoSQL数据库中非常常见,称为非规范化。

要获得更好的介绍,请阅读Denormalizing Your Data is NormalNoSQL data modeling,并观看Firebase for SQL developers