gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:40:26 27 4
gpt4 key购买 nike

我想为我的应用程序的每个用户创建一个数据库。用户名存储在 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”在上述方法中使用,我想使用 SharedPreferences 定义“DATABASE_NAME”)。

有什么办法吗?

最佳答案

由于调用 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 中,您可以按如下方式访问 Helper:

public class MainActivity extends Activity{
...

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

关于android - 在初始化数据库之前将 SharedPreferences 与 SQLiteOpenHelper 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50901511/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com