この質問をする前に、私は既に多くの類似の質問を読んでいますが、私の状況に対しては解決策を見つけることができませんでした。Android SQLiteOpenHelperエラー - スーパーへの呼び出しはコンストラクタ内の最初の文である必要があります
私はSQLiteOpenHelper
クラスを拡張しようとしていますが、2点の有意差で -
super
を使用する場合、それは気にしません使用して)
- 私はSQLCipherを使用しています私ははEの
(これは私がスーパーの前にそれを置くために持っている理由、である) SharedPreferencesからの私のデータベースの場所を取得しています。.G、次のコンストラクタが正常に動作します(私は私の質問に関連していない輸入品と機能は除外している) -
import net.sqlcipher.Cursor;
import net.sqlcipher.SQLException;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
public class LocalDBHelper extends SQLiteOpenHelper {
public static String DB_LOCAL_NAME = "localdata.db";
public static SQLiteDatabase myDataBase;
private final Context myContext;
public LocalDBHelper(Context context) {
super(context, Environment.getExternalStorageDirectory().toString()+File.separator + "myFolder"
+ "/" + DB_LOCAL_NAME, null, 1);
this.myContext = context;
SQLiteDatabase.loadLibs(context);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
onCreate(db);
}
}
しかし、私の場合には、私はデータベースの場所が変更可能にできるようにしたいと (例えば(Android 6.0の場合のように)外部ストレージを使用する許可を与えない場合は、内部ストレージを使用するか、状況に応じてgetExternalFilesDir()
を使用してください) - >そう、長いことを要約すると、私は保存していますデータベースの共有環境設定での位置、および以下のようにコンストラクタを変更することによって、それを使用しようとした -
public QuestionBankDBHelper(Context context) {
SharedPreferences getPrefs = PreferenceManager
.getDefaultSharedPreferences(NoContextAvailable); //What should I use here for the context ?
String getDBLocation = getPrefs.getString("MY_DATABASE_LOCATION", Environment.getExternalStorageDirectory().toString()+File.separator + "myFolder"
+ "/" + DB_LOCAL_NAME);
super(context, getDBLocation, null, 1);
this.myContext = context;
SQLiteDatabase.loadLibs(context);
}
明らかに上記の変更コンストラクタが動作しない、と2つのエラー以下与えます -
- 何コンテキストをすることができます
getDefaultSharedPreferences
と一緒に使用しますか? - スーパーへの呼び出しは、コンストラクターの最初のステートメントでなければなりません。
多くの試行と検索の後でも、私はこれらの2つの問題を回避する方法を考え出すことができず、自分のデータベースの場所を変えることができませんでした。静的メソッドに
'getDefaultSharedPreferences'のコンテキストはどうでしょうか、' myContext'を静的関数。 –
あなたはすでにコンストラクタのパラメータとして持っています –
@ Dr.AtulTiwariは私の答えを更新しました –