Использование 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 через конструктор базы данных.

Другие вопросы по тегам