我有一些用于不同表和查询的单例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_TABLE
和onCreate
一样。有人能指出我制作单例基类的正确方法吗?
答案 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();