在初始化数据库之前将 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 中获取它。
我想为我的应用程序的每个用户创建一个数据库。用户名存储在 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 中获取它。