首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将我的SQLHelper设置为Singleton

如何将我的SQLHelper设置为Singleton
EN

Stack Overflow用户
提问于 2014-01-07 14:29:50
回答 3查看 665关注 0票数 0

我想知道我的SQLHelper是否可以从SQLiteOpenHelper扩展为Singleton类。

我的问题是:

要使用类从SQLiteOpenHelper扩展的对象,我们需要在实例化类时传递一个上下文,即"this“。事实上,我想在任何地方使用我的助手,而不必再次实例化它.

如果有人用一个例子作为我的解决方案,那就太好了:)

谢谢!

这是我目前的课程,我想作为辛格尔顿:

代码语言:javascript
复制
public class SQLHelper extends SQLiteOpenHelper {

/*
 Attributs
*/

public SQLHelper(Context context){
    super(context, DATABASE_NAME, null, 23);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_TABLE_CATEGORIES = "CREATE TABLE " + TABLE_CATEGORIES + "(" + CATEGORY_NAME + " TEXT," + CATEGORY_ID + " INTEGER, " + CATEGORY_ID_PARENT + " INTEGER," + CATEGORY_URL_IMAGE + " TEXT" + ")" ;
    String CREATE_TABLE_INFOS = "CREATE TABLE " + TABLE_INFOS + "(" + INFOS_AGE + " INTEGER," + INFOS_MAIL + " TEXT," + INFOS_DISPLAY_PRICE + " TEXT," + INFOS_TOKEN + " TEXT," + INFOS_REFRESH_TOKEN + " TEXT," + INFOS_TOKEN_EXPIRATION + " TEXT, " + INFOS_REFRESH_TOKEN_EXPIRATION + " TEXT, " + INFOS_APP_VERSION + " TEXT" + ")";
    String CREATE_TABLE_ITEMS = "CREATE TABLE " + TABLE_ITEMS + "(" + ITEM_ID + " INTEGER," + ITEM_NAME + " TEXT," + ITEM_CATEGORY_ID + " INTEGER," + ITEM_PRICE + " REAL" + ")";
    String CREATE_TABLE_SHOPPING_LIST = "CREATE TABLE " + TABLE_SHOPPING_LIST + "(" + SHOPPING_LIST_ID + " INTEGER," + SHOPPING_LIST_NAME + " TEXT," + SHOPPING_LIST_DATE_CREATION + " TEXT" + ")";
    String CREATE_TABLE_SHOPPING_LIST_ITEMS = "CREATE TABLE " + TABLE_SHOPPING_LIST_ITEMS + "(" + SHOPPING_LIST_ITEMS_LIST_ID + " INTEGER," + SHOPPING_LIST_ITEMS_ID + " INTEGER," + SHOPPING_LIST_ITEMS_NB_ITEMS + " INTEGER," + SHOPPING_LIST_ITEMS_CHECKED + " INTEGER" + ")";
    db.execSQL(CREATE_TABLE_CATEGORIES);
    db.execSQL(CREATE_TABLE_INFOS);
    db.execSQL(CREATE_TABLE_ITEMS);
    db.execSQL(CREATE_TABLE_SHOPPING_LIST);
    db.execSQL(CREATE_TABLE_SHOPPING_LIST_ITEMS);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CATEGORIES);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_INFOS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SHOPPING_LIST);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SHOPPING_LIST_ITEMS);
    onCreate(db);
}
/*
 Methods
*/
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-07 14:46:32

不-你回答了自己的问题。因为您需要提供一个参数(在本例中是一个context )来创建SQLiteHelper,所以单例模式将无法工作,因为每次初始化对象时,它必须是不同的。只有当需要一个相同的对象来协调整个系统的功能时,单例才能工作,而不仅仅是当您只想要一个对象的副本时。

您能否强制执行代码,使您的SQLiteHelper只存在一个副本?当然-看看下面的情况:

代码语言:javascript
复制
private static volatile Class mClass  null;

public static Class getInstance(Context context){
    if(mClass == null){
        synchronized(Class.class){
            if(mClass == null){
                mClass = new Class(context);
            }
        }
    }
    return mClass;
}

一开始你会觉得这是个好主意。它看起来是一种创建单例的合法方法(尽管根据有效的Java,有更好的方法来做到这一点,比如使用enum类型)。实际上,您将只得到一份类初始化的副本。问题是,除了第一种情况外,context在每一种情况下都是错误的。你不需要成为单身人士的专家才能意识到这只是个坏主意。

票数 0
EN

Stack Overflow用户

发布于 2014-01-07 14:32:50

你可以这样做,但我不认为这是个好主意:

代码语言:javascript
复制
private static DataBaseHelper instance;

private DataBaseHelper() {
    super(App.getAppContext(), DB_NAME, null, 1);
    this.context = context;
}   

public static DataBaseHelper getInstance() {
    if (instance == null) {
        instance = new DataBaseHelper();
    }
    return instance;
}
票数 0
EN

Stack Overflow用户

发布于 2014-01-07 14:34:10

选择私有构造函数和getInstance方法

代码语言:javascript
复制
public class SQLHelper extends SQLiteOpenHelper {

private static SQLHelper sqlHelper = null;

private SQLHelper(Context context){
    super(context, DATABASE_NAME, null, 23);
}

public static SQLHelper getInstance(){
if(sqlHelper == null){
sqlHelper = new SQLHelper(context);
return sqlHelper;
}
return sqlHelper;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20974220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档