我有一个在'/storage/emulated/0/databases/mydb.db'创建数据库文件的应用程序,并且该数据库中有文件。 我有另一个试图打开这个数据库的应用程序。但是我收到错误代码14.尝试在此数据库中运行表时无法打开数据库。
public class DataBaseHelper extends SQLiteOpenHelper {
public SQLiteDatabase myDataBase;
public String TABLE_NAME;
// Database Information
static final String DB_NAME = "mydb.DB";
public static final String FILE_DIR = "databases";
private String DB_PATH = Environment.getExternalStorageDirectory()
+ File.separator + FILE_DIR + File.separator + DB_NAME;
public DataBaseHelper(Context context, String name) {
super(context, name, null, 1);
TABLE_NAME = name;
}
public void openDatabase() throws SQLiteException {
String DBPath = DB_PATH + "/" +TABLE_NAME;
myDataBase = SQLiteDatabase.openDatabase(DBPath,null,SQLiteDatabase.OPEN_READWRITE);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
我在myDataBase = SQLiteDatabase.openDatabase(DBPath,null,SQLiteDatabase.OPEN_READWRITE);
答案 0 :(得分:0)
<强> 1。许可强>
您的应用需要文件读取权限。在Android 6.0之上,您需要请求运行时权限。
的 2。错误的路径
似乎是路径
/storage/emulated/0/databases/mydb.db
与下面的路径不同。
Environment.getExternalStorageDirectory() + File.separator + FILE_DIR + File.separator + DB_NAME
因此,在打开数据库文件之前,比较两个路径以检查它是否相同。
if (DB_PATH.compareTo("/storage/emulated/0/databases/mydb.db")){
// Do something
}
并检查以确定它确实存在。
File file = new File(myPath);
if (file.exists() && !file.isDirectory()) {
// Do something
}
答案 1 :(得分:0)
要注意的另一件事是API 29中已弃用Environment.getExternalStorageDirectory()
:
此方法已在API级别29中弃用。
为了提高用户隐私,不建议直接访问共享/外部存储设备。 当应用程序定位到Build.VERSION_CODES.Q时,此方法返回的路径将不再可供应用程序直接访问。通过迁移到Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT之类的替代方案,应用程序可以继续访问共享/外部存储中存储的内容。