Singleton Sqlite基类

时间:2016-03-12 05:15:39

标签: java android sqlite

我有一些用于不同表和查询的单例sqlite适配器。在那些适配器中,我发现有一些数据库启动方法和变量可以放在基类中,这样我就不需要在每个适配器中反复写出它们。以下是我到目前为止所做的基类with the help of this thread

基类DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "postsDatabase";
    private static final int DATABASE_VERSION = 1;
    private static DatabaseHelper sInstance;
    public static String MAIN_TABLE; // will be replaced when instantiated
    private Context context;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public static synchronized DatabaseHelper getInstance(Context context) {
        // Use the application context, which will ensure that you
        // don't accidentally leak an Activity's context.
        // See this article for more information: http://bit.ly/6LRzfx
        if (sInstance == null) {
            sInstance = new DatabaseHelper(context.getApplicationContext());
        }
        sInstance.context = context;
        return sInstance;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion != newVersion) {
            // Simplest implementation is to drop all old tables and recreate them
            db.execSQL("DROP TABLE IF EXISTS " + MAIN_TABLE);
            onCreate(db);
        }
    }

    // will be replaced when instantiated
    @Override
    public void onCreate(SQLiteDatabase database) {}

    @Override
    public void onConfigure(SQLiteDatabase db) {
        super.onConfigure(db);
    }

}

在适配器中使用:

public class AnimalTableAdapter{

    public AnimalTableAdapter(Context context) {

        dbHelper = new DatabaseHelper(context){

            public static final String MAIN_TABLE = "animal";

            @Override
            public void onCreate(SQLiteDatabase db) {
                CREATE_SEARCH_STRING_TABLE = "//****sql query**** //";
                db.execSQL(CREATE_SEARCH_STRING_TABLE);

            }
        };
        db = dbHelper.getWritableDatabase();
    }
}

但是,我不认为DatabaseHelper基类是单例,因为constructor是公共的,但当我把它变成私有构造函数时,我不能再覆盖一些方法和变量像动物适配器中的MAIN_TABLEonCreate一样。有人能指出我制作单例基类的正确方法吗?

2 个答案:

答案 0 :(得分:1)

  

有人能指出我制作单身基类的正确方法吗?

允许子类A的单例类B在术语上是矛盾的。 B的任何实例也都是A。如果B的实例和A的实例同时存在,则会违反A的“单身”。

此外,没有办法在Java中实现strict(static)singleton类的子类。

更好的方法是将公共代码移动到原始单例类的抽象超类,并将新的单例类编写为抽象类的子类或原始单例类。

我猜你可以在单身人士的构造函数public中拼凑一些东西并做一些粗略的运行时检查,看看它是否是通过子类构造函数调用的。但那是一个非常糟糕的主意...... IMO。

答案 1 :(得分:1)

你的DatabaseHelper不是单身人士,这是绝对正确的。您需要将构造函数设置为私有才能实现。

然而,你的方向似乎与我相矛盾。为什么你需要匿名继承你的DatabaseHelper?如果您需要使用特定查询从特定表中进行查询,请在DatabaseHelper中创建一个方法,然后使用Adapter中的方法。

DatabaseHelper db = DatabaseHelper.getInstance(context);
db.fetchData();