デフォルトのパスではなく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にファイルを作成するだけですが、デフォルトのパスではすべてがうまく機能します。
私は私のDBを作成しました
public DatabaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator + FILE_DIR
+ File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}
それ以上問題はありませんでした。 super()への呼び出しもsdcardを参照する必要があると思います。
super()
呼び出しで不完全な名前を指定しています。使用してみてください:
_OpenHelper(Context context) {
super(context, "/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);
}
_
それ以外は、常にEnvironment.getExternalStoreDirectory()
を使用して外部ストレージへのパスを取得する必要があります。また、使用する前に外部ストレージの状態を確認する必要があります。
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" />**
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 /
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);
}
...
...
}
コンストラクタにパスを与えるだけです。
DatabaseHelper(Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator + "/DataBase/" + File.separator
+ DB_NAME, null, DB_VERSION);
}