/ / Достъпът до Sqlite DB от SD карта дава грешка - android, sqlite, android-sdcard, sd-карта, sqliteopenhelper

Достъп до Sqlite DB от SD карта дава грешка - android, sqlite, android-sdcard, sd-card, sqliteopenhelper

Имам sqlite db в SD карта. Опитвам се да го отворя от дейност, но получавам грешката по-долу.

Failed to open database "/storage/sdcard1/deltalearn/deltalearn.db".
android.database.sqlite.SQLiteException: not an error (code 0): Could not open the database in read/write mode.
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:214)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:198)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)

По-долу е кодът, който използвам за отваряне на БД. Не мога да използвам Environment.getExternalStorageDirectory() тъй като това сочи вътрешно съхранение в няколко телефона.

DatabaseHandler databaseHandler = new DatabaseHandler(this);
public DatabaseHandler(Context context) {
super(context, AndroidUtils.getExternalStoragePath()
+ File.separator + Constants.DATABASE_FOLDER_NAME
+ File.separator + DATABASE_NAME, null, DATABASE_VERSION);
Log.d("DatabaseHandler::","public DatabaseHandler(Context context)");

File dbFile=new File(AndroidUtils.getExternalStoragePath()
+ File.separator + Constants.DATABASE_FOLDER_NAME
+ File.separator + DATABASE_NAME);

SQLiteDatabase.openOrCreateDatabase(dbFile, null);

Log.d("DatabaseHandler::", "path: route:" + AndroidUtils.getExternalStoragePath()
+ File.separator + Constants.DATABASE_FOLDER_NAME
+ File.separator + DATABASE_NAME);
}

public static String getExternalStoragePath() {
String removableStoragePath = "";
//working in Moto, but not working in Samsung S3
File fileList[] = new File("/storage/").listFiles();
for (File file : fileList) {
if (!file.getAbsolutePath().equalsIgnoreCase(Environment.getExternalStorageDirectory().getAbsolutePath()) && file.isDirectory() && file.canRead()) {
removableStoragePath = file.getAbsolutePath();
}
}
Log.d("AndroidUtils:: ", "getExternalStoragePath: removableStoragePath:" + removableStoragePath);
if (removableStoragePath.contains("emulated")) {
//working in Samsung s3, but not working in Moto
String path = "";
File file = new File("/system/etc/vold.fstab");
FileReader fr = null;
BufferedReader br = null;

try {
fr = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

try {
if (fr != null) {
br = new BufferedReader(fr);
String s = br.readLine();
while (s != null) {
if (s.startsWith("dev_mount")) {
String[] tokens = s.split("\s");
path = tokens[2]; //mount_point
if (!Environment.getExternalStorageDirectory().getAbsolutePath().equals(path)) {
break;
}
}
s = br.readLine();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Log.d("AndroidUtils::", "getExternalStoragePath: path:" + path);
return path;
} else {
//working in Moto, but not working in Samsung galaxy S3
return removableStoragePath;
}
}

Но същият Db работи, ако е копиран във вътрешна памет.

Отговори:

0 за отговор № 1

Трябва да потвърдите, че използвате getWriteableDatabase().
СъщоEnvironment.getExternalStorageDirectory() не винаги сочи SD картата, моженасочете се и към вътрешното съхранение, той варира от устройство до устройство, така че наистина не можете да разчитате на него. Доколкото знам, няма определен начин или метод за винаги получаване на SD карта. И това вероятно не го прави не работя на някои устройства вместо вас. Защо да не съхранявате вашата база данни във вътрешна памет? Къде само вашето приложение може да има достъп до него. Ако записвате изображения като петна, можете вместо това да съхранявате техните пътища.