web-dev-qa-db-ja.com

SQLiteデータベースをSDカードに直接保存する方法

デフォルトのパスではなくsdcardにsqliteデータベースを作成したい... sdcardからすべてのデータにアクセスしたいのですが、次のコードも使用しています。

            private static class OpenHelper extends SQLiteOpenHelper {

    OpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE "
                + TABLE_NAME
                + " (id INTEGER PRIMARY KEY, name TEXT, number TEXT, skypeId TEXT, address TEXT, image BLOB)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

問題:

デフォルトパスでデータベースファイルを表示すると、すべてのデータとテーブルを表示できますが、SDカードで作成されたデータベースファイルを表示すると、データは表示されず、データベースファイルのみが表示されます

INコンストラクター sdcardにファイルを作成するだけですが、デフォルトのパスではすべてがうまく機能します。

20
Shiv

私は私のDBを作成しました

    public DatabaseHelper(final Context context) {
    super(context, Environment.getExternalStorageDirectory()
            + File.separator + FILE_DIR
            + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}

それ以上問題はありませんでした。 super()への呼び出しもsdcardを参照する必要があると思います。

43
koljaTM

super()呼び出しで不完全な名前を指定しています。使用してみてください:

_OpenHelper(Context context) {
    super(context, "/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION);
    SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);

}
_

それ以外は、常にEnvironment.getExternalStoreDirectory()を使用して外部ストレージへのパスを取得する必要があります。また、使用する前に外部ストレージの状態を確認する必要があります。

2
Raghav Sood
public DataBaseHelper(final Context context) {

    super(context, Environment.getExternalStorageDirectory()
    + File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}

**Also Add permission in Android Manifest
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />**
1

Android 6.0(APIレベル23)から)、ユーザーはアプリをインストールするときではなく、アプリの実行中にアプリに権限を付与します。このアプローチは、ユーザーがアプリをインストールまたは更新するときに権限を付与する必要があります。

実行時に権限を取得するには、ユーザーをリクエストする必要があります。次の方法でそれを行うことができます。

権限の最初のリクエスト。

String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
        requestPermissions(permissions, WRITE_REQUEST_CODE);

そして、あなたは結果をチェックすることができます

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
       case WRITE_REQUEST_CODE:
         if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
           //Permission granted.
           //Continue with writing files...
         }
       else{
           //Permission denied.
         }
        break;
    }
}

これが良い学習ソースです requesting-runtime-permissions-in-Android-Marshmallow /

0
atiruz

Environment.getExternalStorageDirectory() メソッドの使用は非推奨です。

このメソッドはAPIレベル29で廃止されました。ユーザーのプライバシーを向上させるために、共有/外部ストレージデバイスへの直接アクセスは廃止されました。アプリがBuild.VERSION_CODES.Qをターゲットとする場合、このメソッドから返されたパスは、アプリから直接アクセスできなくなります。アプリは、Context#getExternalFilesDir(String)、MediaStore、またはIntent#ACTION_OPEN_DOCUMENTなどの代替手段に移行することで、共有/外部ストレージに保存されているコンテンツに引き続きアクセスできます。

ここで getExternalFilesDir() を使用する必要があります。これは例です:

public class MyDataBaseHelper extends SQLiteOpenHelper {

    //Constructor
    MyDataBaseHelper(Context context) {
    super(context, context.getExternalFilesDir()
            + File.separator + "/Database/" + File.separator
            + DATABASE_QUESTION, null, DATABASE_VERSION);
    }
   ...
   ...
}
0
Jorgesys

コンストラクタにパスを与えるだけです。

 DatabaseHelper(Context context) {
    super(context, Environment.getExternalStorageDirectory()
            + File.separator + "/DataBase/" + File.separator
            + DB_NAME, null, DB_VERSION);
}
0
Vishal Vaishnav