无法打开数据库文件

时间:2017-01-04 08:54:26

标签: android sql database sqlite android-sqlite

我有一个在'/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);

收到错误消息

2 个答案:

答案 0 :(得分:0)

<强> 1。许可

您的应用需要文件读取权限。在Android 6.0之上,您需要请求运行时权限。

请参阅:android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database


 的 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
}

详细信息:android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database trouble

答案 1 :(得分:0)

要注意的另一件事是API 29中已弃用Environment.getExternalStorageDirectory()

lecture notes

此方法已在API级别29中弃用。

为了提高用户隐私,不建议直接访问共享/外部存储设备。 当应用程序定位到Build.VERSION_CODES.Q时,此方法返回的路径将不再可供应用程序直接访问。通过迁移到Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT之类的替代方案,应用程序可以继续访问共享/外部存储中存储的内容。