在初始化数据库之前将 SharedPreferences 与 SQLiteOpenHelper 结合使用

Using SharedPreferences with SQLiteOpenHelper before initialising the database

我想为我的应用程序的每个用户创建一个数据库。用户名存储在 SharedPreferences 中。所以我正在寻找这样的东西:

public class DatabaseHelper extends SQLiteOpenHelper {

    final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    String LoggedInUser = sp.getString("user","");

    public static final String DATABASE_NAME = LoggedInUser + ".db";

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

    public void onCreate(SQLiteDatabase db) {
        ...
    }
    ...

}

但这不起作用,因为 SharedPreferences 需要上下文(使用 getApplicationContext() 而不是 this 也不起作用。这可以通过这样的方式解决:

private Context appContext;
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
    this.appContext = context;
}

然后访问 SharedPreferences。

但是我需要在这个方法之前访问SharedPreferences("DATABASE_NAME"在上面的方法中使用,我想定义"DATABASE_NAME"使用SharedPreferences)。

有什么办法吗?

由于调用 super() 必须是第一个语句,实现它的唯一解决方案是将 DATABASE_NAME 作为构造函数参数传递:

public DatabaseHelper(final Context context, final string dbName) {
        super(context, dbName, null, 1);
 }

然后您可以实施工厂模式或外观模式来构造或将值传递给 DatabaseHelper,或者简单地传递来自 Activity/Fragment 的 dbName 值。

工厂的一个例子可以是:

public final class DatabaseFactory {

    public static DatabaseHelper getDataBaseHelper(final Context context){
        final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
        final String loggedInUser = sp.getString("user","");
        return new DatabaseHelper(context,loggedInUser);
    }
}

在 Activity 中,您可以按如下方式访问助手:

public class MainActivity extends Activity{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        final DatabaseHelper myDB = DatabaseFactory.getDataBaseHelper(this);
        ...
    }
}

你必须在 SQLiteOpenHelper 中使用 SharedPreference 吗? 我认为您可能在 Activity 中使用了 SQLite,那么如何先在 Activity 中声明 SharedPreference,然后通过数据库的构造函数在 SQLite 中获取它。