【问题标题】:Android database helper singleton - instantiate in activity or all fragments?Android数据库助手单例 - 在活动或所有片段中实例化?
【发布时间】:2016-04-04 09:26:31
【问题描述】:

我有一个 DBHelper 类设置为单例:

public class DBHelper extends SQLiteOpenHelper {

    private static DBHelper sInstance;

    public static synchronized DBHelper getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new DBHelper(context.getApplicationContext());
        }
        return sInstance;
    }

    private DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        databasePath = context.getDatabasePath(DATABASE_NAME).getPath();
    }
}

我有一个MainActivity 和一些片段。其中许多片段需要访问我的 DBHelper 方法

我应该在每个需要访问数据库的片段中使用dbHelper = DBHelper.getInstance(getApplicationContext()) 吗?由于单例模式,实例化只会发生一次,所以我不需要担心使用该代码在每个片段中实例化的类

或者最好只在MainActivity 中实例化 DBHelper,然后在需要访问数据库的任何片段中获取对 mainactivity 的引用并从那里调用对象方法?每个片段中都有这样的内容:

mainActivity = (MainActivity) getActivity();
mainActivity.dbHelper.insertData();

【问题讨论】:

  • 建议第一种方式。DB模块应该是独立的
  • 顺便说一句,您可以在扩展应用程序的自定义应用程序中实例化DBHelper

标签: android android-fragments android-activity android-sqlite android-database


【解决方案1】:

既然您确定 Singleton 将在 MainActivity 中实例化,第一种方法应该没有任何问题,您甚至可以在片段中调用 getInstance(null)

【讨论】:

    【解决方案2】:

    我认为最有成效的决定是创建自定义片段类,将其扩展为您的片段或 v4.fragment,在其中初始化 dbHelper 并在您的活动中使用您的自定义片段。这是我的拙见:)

    【讨论】:

      【解决方案3】:

      这里的代码是解决单例模式并发问题的一种简单方法。

      public DBHelper extends SQLiteOpenHelper {
          // declare private constructor
          // some public method
      
          public static class Wrapper {
              private static DBHelper dbHelper;
              public static void init(Context ctx, Object otherArgs) {
                  // init DBHelper
                  dbHelper = new DBHelper(ctx, otherArgs);
              }
              public static DBHelper get(){
                  return dbHelper;
              }
          }
      }
      

      在自定义应用程序中

      public MyApp extends Application{
          void onCreate(){
              DBHelper.Wrpper.init(this, otherArgs);
          }
      }
      

      这样的代码需要 DBHelper:

      DBHelper.Wrapper.get().insertData();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        相关资源
        最近更新 更多