1

この質問をする前に、私は既に多くの類似の質問を読んでいますが、私の状況に対しては解決策を見つけることができませんでした。Android SQLiteOpenHelperエラー - スーパーへの呼び出しはコンストラクタ内の最初の文である必要があります

私はSQLiteOpenHelperクラスを拡張しようとしていますが、2点の有意差で -

  • (私はコンストラクタでトップ にsuperを使用する場合、それは気にしません使用して)

    1. 私は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つのエラー以下与えます -

    1. 何コンテキストをすることができますgetDefaultSharedPreferencesと一緒に使用しますか?
    2. スーパーへの呼び出しは、コンストラクターの最初のステートメントでなければなりません。

    多くの試行と検索の後でも、私はこれらの2つの問題を回避する方法を考え出すことができず、自分のデータベースの場所を変えることができませんでした。静的メソッドに

  • 答えて

    3

    移動getDBLocationコード:

    private static String getDBLocation(Context context) { 
        SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
        String getDBLocation = getPrefs.getString("MY_DATABASE_LOCATION", 
          Environment.getExternalStorageDirectory().toString() 
           + File.separator + "myFolder" + "/" + DB_LOCAL_NAME); 
        return getDBLocation; 
    } 
    
    public QuestionBankDBHelper(Context context) { 
        super(context, getDBLocation(context), null, 1); 
        this.myContext = context; 
        SQLiteDatabase.loadLibs(context); 
    } 
    
    +0

    'getDefaultSharedPreferences'のコンテキストはどうでしょうか、' myContext'を静的関数。 –

    +0

    あなたはすでにコンストラクタのパラメータとして持っています –

    +0

    @ Dr.AtulTiwariは私の答えを更新しました –

    2

    単純な答え:

    1. パラメータとしてコンテキストを受け取り、DBパス
    2. が最初のステートメントとしてsuperを入れて返す静的関数を作成して静的関数をパスパラメータとして返す

    適切な解決策は、このクラスのデータベースへのパスを見つけることに関するあらゆる種類の知識を削除することです。このクラスを構築する前に、すべてのチェック、計算、質問、および定義済みのパスを持つこのクラスのコールコンストラクタのみを実行する必要があります。

    関連する問題