Использование SharedPreferences с SQLiteOpenHelper перед инициализацией базы данных
Я хотел бы иметь базу данных для каждого пользователя моего приложения. Имена пользователей хранятся в 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).
Есть ли способ сделать это?
2 ответа
С призыва super()
должно быть первым заявлением, единственное решение для достижения этого было бы передать DATABASE_NAME
в качестве параметра конструктора:
public DatabaseHelper(final Context context, final string dbName) {
super(context, dbName, null, 1);
}
Затем вы можете реализовать фабричный или фасадный шаблон для создания или передать значение DatabaseHelper
или просто передать dbName
значение из Activity/Fragment.
Примером Фабрики может быть:
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);
...
}
}
Должны ли вы использовать SharedPreference в вашем SQLiteOpenHelper? Я думаю, что вы, возможно, используете SQLite в своей Activity, а как насчет того, чтобы сначала объявить SharedPreference в вашей Activity, а получить его в SQLite через конструктор базы данных.