Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在后端将MVVM和n层体系结构与Firestore相结合_Android_Mvvm_Google Cloud Firestore_Android Architecture Components - Fatal编程技术网

Android 在后端将MVVM和n层体系结构与Firestore相结合

Android 在后端将MVVM和n层体系结构与Firestore相结合,android,mvvm,google-cloud-firestore,android-architecture-components,Android,Mvvm,Google Cloud Firestore,Android Architecture Components,我正在尝试重新构建代码库,使用Android架构组件实现MVVM架构和三层架构 MainActivity.java文件包含一个片段,这个片段是大多数用户交互发生的地方。用户提供了一个输入,基于该输入,我希望能够点击Firebase Firestore数据库来获取相关数据,然后将其显示在UI上。该方法应遵循关注点分离原则 当前,在收到用户对片段的输入时,我使用接口,将输入中继到其父活动,即MainActivity.java,然后调用函数获取用户请求数据。收到数据后,我会将其适当地显示在UI上(而不

我正在尝试重新构建代码库,使用Android架构组件实现
MVVM
架构和三层架构

MainActivity.java
文件包含一个
片段
,这个
片段是大多数用户交互发生的地方。用户提供了一个输入,基于该输入,我希望能够点击
Firebase Firestore
数据库来获取相关数据,然后将其显示在UI上。该方法应遵循
关注点分离原则

当前,在收到用户对
片段的输入时,我使用
接口
,将输入中继到其父活动,即
MainActivity.java
,然后调用函数
获取用户请求数据
。收到数据后,我会将其适当地显示在UI上(而不是片段的一部分)

但是,我希望我的1)业务逻辑层、2)数据库访问层和3)UI层在单独的包中。(以确保遵循n层体系结构模式)

另外,使用
Firestore
作为我的应用程序的数据库,我不确定从数据层到UI模型的整个过程中,应该如何处理用户输入和
Firestore
输出的数据流。请注意,
Firestore
数据库调用是异步的

如何设置代码库以遵循三层之间的正确通信模型,从而使其既遵循
MVVM
又遵循n层体系结构

代码如下:

MainActivity.java

public class MainActivity extends AppCompatActivity implements FragmentClass.DataPasser {

    FirebaseAuth firebaseAuth;
    FirebaseUser firebaseUser;
    private ArrayList<DataType> dataList = new ArrayList<>();
    DataProvider dataProvider = new DataProvider();
    .
    .
    .

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        .
        .
        .
    }

    @Override
    protected void onStart() {
        super.onStart();

        .
        .
        .
    }

    @Override
    public void onUserInput(DataType input) {
        dataList = dataProvider.ProvideData(input);
        //update UI using this dataList
    }
}
DataProvider.java

public class DataProvider {

    private ArrayList<DataType> dataList = new ArrayList<>();
    DataFetcher dataFetcher = new DataFetcher();

    public ArrayList<DataType> ProvideData(String userInput) {

        dataList = dataFetcher(userInput);
        return dataList;
    }

    private ArrayList<DataType> dataFetcher(String userInput) {
        ArrayList<DataType> fetchedData = new ArrayList<>();

        fetchedData = dataFetcher.DatabaseCaller(userInput);

        return fetchedData;
    }
}
公共类数据提供程序{
private ArrayList dataList=new ArrayList();
DataFetcher DataFetcher=新的DataFetcher();
公共ArrayList提供的数据(字符串用户输入){
dataList=dataFetcher(userInput);
返回数据列表;
}
专用ArrayList数据获取程序(字符串用户输入){
ArrayList fetchedData=新建ArrayList();
fetchedData=dataFetcher.DatabaseCaller(userInput);
返回获取的数据;
}
}
DataFetcher.java

public class DataFetcher {

    ArrayList<DataType> dataList;
    FirebaseFirestore firestore = FirebaseFirestore.getInstance();

    public ArrayList<DataType> DatabaseCaller(String userInput) {

    //formulate query based on userInput
    //hit database and fetch dataList
    
        return dataList;
    }
}
公共类数据获取程序{
ArrayList数据表;
FirebaseFirestore=FirebaseFirestore.getInstance();
公共ArrayList DatabaseCaller(字符串userInput){
//基于用户输入制定查询
//点击数据库并获取数据列表
返回数据列表;
}
}

到目前为止您尝试了什么?创建了三个类:MainActivity、DataProvider和DataFetcher。然后在DataProvider中创建DataFetcher对象,在MainActivity中创建DataProvider对象。将用户参数传递给DataProvider的函数,DataProvider又将其传递给DataFetcher的函数。DataFetcher的函数用于制定firestore查询。也尝试了这种方法,但没有按预期工作。请不要描述代码,而是将其添加到您的问题中。您好,下面是两个实现Android MVVM架构模式的示例。在本报告中,您还可以找到一个详细的示例应用程序,该应用程序使用Dagger2、Room、RxJava、FastAndroidNetworking、Placeholder View和AndroidDebugDatabase实现MVVM体系结构。在本文中,您将看到一个基于MVVM模式和存储库模式的实现示例。
public class DataFetcher {

    ArrayList<DataType> dataList;
    FirebaseFirestore firestore = FirebaseFirestore.getInstance();

    public ArrayList<DataType> DatabaseCaller(String userInput) {

    //formulate query based on userInput
    //hit database and fetch dataList
    
        return dataList;
    }
}