Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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:从活动还是片段访问数据库?_Android_Sqlite_Android Fragments_Android Intent - Fatal编程技术网

Android:从活动还是片段访问数据库?

Android:从活动还是片段访问数据库?,android,sqlite,android-fragments,android-intent,Android,Sqlite,Android Fragments,Android Intent,我有一个带有三个独立片段的main活动。我需要访问每个片段中的SQLite数据库中的数据 数据对象MyObject包含基本类型以及其他对象的列表 因此,假设我们有三个片段,片段A,片段B和片段C FragmentB创建MyObject对象并将其保存到数据库中。保存后,FragmentC打开并填充MyObject数据 FragmentA列出所有MyObject对象,单击列表中的一个项目后,将打开FragmentC并填充所选的MyObject 什么是正确的实现 活动是否应该控制所有数据库访问并将My

我有一个带有三个独立片段的
main活动。我需要访问每个片段中的SQLite数据库中的数据

数据对象
MyObject
包含基本类型以及
其他对象的列表

因此,假设我们有三个片段,
片段A
片段B
片段C

FragmentB
创建
MyObject
对象并将其保存到数据库中。保存后,
FragmentC
打开并填充
MyObject
数据

FragmentA
列出所有
MyObject
对象,单击列表中的一个项目后,将打开
FragmentC
并填充所选的
MyObject

什么是正确的实现

活动是否应该控制所有数据库访问并将
MyObject
传递给相应的片段

每个片段是否应该每次访问数据库,以便自己访问数据

是否应
FragmentA
FragmentB
读入数据并将相应的
MyObject
传递给
FragmentC

对于从
fragment->activity->fragment
activity->fragment
传递数据的情况,哪种方法最适合:

  • 可包裹的
  • 意图
  • 界面(通过活动)
  • 由于
    MyObject
    包含
    OtherObject
    的列表,而且所有数据都不能很容易地分解和传输,因此使用parcelable似乎很困难

    显示使用接口将数据从片段传输到活动,其中片段声明在活动中实现的接口
    。要将对象从活动转移到片段,是否在活动中声明另一个接口,并在片段中实现它

    我找不到任何直接的建议


    感谢您的帮助

    如果我正确地解释了您的情况,我会使用
    接口
    MyObject
    对象从
    片段B
    传递到
    活动
    ,然后转到
    片段C
    ,或
    本地广播管理器
    事件总线
    。然而,在开始之前,我应该指出我是从内存输入的,所以我不能给出
    LocalBroadcastManager
    或GreenRobot的示例,但这两个选项都是可行的选择

    public class FragmentB {
        FragCallbacks mCallbacks;
    
    public interface FragCallbacks {
        void objectSavedToDatabase(MyObject object);
    }
    
    @Override
    public void onAttach (Activity activity) {
        if (activity instanceof FragCallbacks) {
             mCallbacks = (FragCallbacks) activity;
        }
    
    // Logic for writing to your database, and then, on completion...
    mCallbacks.objectSavedToDatabase(objectJustWrittenToDatabase);
    
    然后,在你的活动中

    public class MainActivity implements FragmentB.FragCallbacks {
    
    FragmentC fragmentC;
    
    @Override
    public void objectSavedToDatabase(MyObject object) {
        fragmentC = FragmentC.newInstance(params);
        //If MyObject is Parcelable, you can pass it as a parameter here.
        //This is probably the preferable option. Otherwise, you can use a 
        // "setMyObject()" method.
        getFragmentManager()
            .beginTransaction()
            .replace(...)
            .commit();
       fragmentC.setMyObject(object);
    

    如果我正确地解释了您的情况,我会使用
    接口
    MyObject
    对象从
    片段B
    传递到
    活动
    ,然后再传递到
    片段C
    ,或
    本地广播管理器
    事件总线
    。然而,在开始之前,我应该指出我是从内存输入的,所以我不能给出
    LocalBroadcastManager
    或GreenRobot的示例,但这两个选项都是可行的选择

    public class FragmentB {
        FragCallbacks mCallbacks;
    
    public interface FragCallbacks {
        void objectSavedToDatabase(MyObject object);
    }
    
    @Override
    public void onAttach (Activity activity) {
        if (activity instanceof FragCallbacks) {
             mCallbacks = (FragCallbacks) activity;
        }
    
    // Logic for writing to your database, and then, on completion...
    mCallbacks.objectSavedToDatabase(objectJustWrittenToDatabase);
    
    然后,在你的活动中

    public class MainActivity implements FragmentB.FragCallbacks {
    
    FragmentC fragmentC;
    
    @Override
    public void objectSavedToDatabase(MyObject object) {
        fragmentC = FragmentC.newInstance(params);
        //If MyObject is Parcelable, you can pass it as a parameter here.
        //This is probably the preferable option. Otherwise, you can use a 
        // "setMyObject()" method.
        getFragmentManager()
            .beginTransaction()
            .replace(...)
            .commit();
       fragmentC.setMyObject(object);
    

    如果我正确地解释了您的情况,我会使用
    接口
    MyObject
    对象从
    片段B
    传递到
    活动
    ,然后再传递到
    片段C
    ,或
    本地广播管理器
    事件总线
    。然而,在开始之前,我应该指出我是从内存输入的,所以我不能给出
    LocalBroadcastManager
    或GreenRobot的示例,但这两个选项都是可行的选择

    public class FragmentB {
        FragCallbacks mCallbacks;
    
    public interface FragCallbacks {
        void objectSavedToDatabase(MyObject object);
    }
    
    @Override
    public void onAttach (Activity activity) {
        if (activity instanceof FragCallbacks) {
             mCallbacks = (FragCallbacks) activity;
        }
    
    // Logic for writing to your database, and then, on completion...
    mCallbacks.objectSavedToDatabase(objectJustWrittenToDatabase);
    
    然后,在你的活动中

    public class MainActivity implements FragmentB.FragCallbacks {
    
    FragmentC fragmentC;
    
    @Override
    public void objectSavedToDatabase(MyObject object) {
        fragmentC = FragmentC.newInstance(params);
        //If MyObject is Parcelable, you can pass it as a parameter here.
        //This is probably the preferable option. Otherwise, you can use a 
        // "setMyObject()" method.
        getFragmentManager()
            .beginTransaction()
            .replace(...)
            .commit();
       fragmentC.setMyObject(object);
    

    如果我正确地解释了您的情况,我会使用
    接口
    MyObject
    对象从
    片段B
    传递到
    活动
    ,然后再传递到
    片段C
    ,或
    本地广播管理器
    事件总线
    。然而,在开始之前,我应该指出我是从内存输入的,所以我不能给出
    LocalBroadcastManager
    或GreenRobot的示例,但这两个选项都是可行的选择

    public class FragmentB {
        FragCallbacks mCallbacks;
    
    public interface FragCallbacks {
        void objectSavedToDatabase(MyObject object);
    }
    
    @Override
    public void onAttach (Activity activity) {
        if (activity instanceof FragCallbacks) {
             mCallbacks = (FragCallbacks) activity;
        }
    
    // Logic for writing to your database, and then, on completion...
    mCallbacks.objectSavedToDatabase(objectJustWrittenToDatabase);
    
    然后,在你的活动中

    public class MainActivity implements FragmentB.FragCallbacks {
    
    FragmentC fragmentC;
    
    @Override
    public void objectSavedToDatabase(MyObject object) {
        fragmentC = FragmentC.newInstance(params);
        //If MyObject is Parcelable, you can pass it as a parameter here.
        //This is probably the preferable option. Otherwise, you can use a 
        // "setMyObject()" method.
        getFragmentManager()
            .beginTransaction()
            .replace(...)
            .commit();
       fragmentC.setMyObject(object);
    
    一,。实施

    内容提供商管理对中央数据存储库的访问。提供者是Android应用程序的一部分,Android应用程序通常提供自己的UI来处理数据

    二,。使用

    此类为应用程序提供对内容模型的访问

    • 例如,直接查询光标:
    • 或通过 回调
    执行数据异步加载的类。当加载程序处于活动状态时,它们应该监视数据源,并在内容更改时提供新结果。有关详细信息,请参见LoaderManager

    为什么?

    • 将数据模型与应用程序逻辑分离——在小项目中,这是不可取的,但当您的项目发展起来时,您将看到付出的努力得到了回报
      • 1。实施

        内容提供商管理对中央数据存储库的访问。提供者是Android应用程序的一部分,Android应用程序通常提供自己的UI来处理数据

        二,。使用

        此类为应用程序提供对内容模型的访问

        • 例如,直接查询光标:
        • 或通过 回调
        执行数据异步加载的类。当加载程序处于活动状态时,它们应该监视数据源,并在内容更改时提供新结果。有关详细信息,请参见LoaderManager