Невозможно открыть ENOENT, так как он говорит, что файл или каталог не существует.
Вы, вероятно, можете полагаться на Environment.getExternalStorageDirectory (). ToString (), возвращающий существующий каталог.
Однако после этого вы добавляете / app_name / databse.db вполне вероятно, что каталог app_name может не существовать. Поэтому вы должны создать каталог, если он не существует.
Например, вы можете использовать: -
File dbpath = (new File(Environment.getExternalStorageDirectory().toString() + "/app_name/databse.db"));
if (!(new File(dbpath.getParent()).exists())) {
new File(dbpath.getParent()).mkdirs();
}
myDatabase = SQLiteDatabase.openOrCreateDatabase(dbpath,null);
Вышеприведенное предполагает, что вы, для API 23+, запросили разрешение у приложения в дополнение к запросу разрешения через манифест.
Лично я просто добавлю этот класс: -
class ExternalStoragePermissions {
public int API_VERSION = Build.VERSION.SDK_INT;
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private ExternalStoragePermissions() {}
// Note call this method
public static void verifyStoragePermissions(Activity activity) {
int permission = ActivityCompat.checkSelfPermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
}
и убедитесь, что он вызывается, если требуется, перед выполнением таких запросов.
например. : -
if (Build.VERSION.SDK_INT >= 23) {
ExternalStoragePermissions.verifyStoragePermissions(this);
}
- WRITE автоматически выдает READ