我正在尝试使用以下代码在我的应用程序中创建SQLite数据库:
myDataBase = SQLiteDatabase.openOrCreateDatabase(DB_FULL_PATH, null);
DB_FULL_PATH
是:
Environment.getExternalStorageDirectory().toString() + "/app_name/databse.db";
该文件夹存在于我的My files
应用程序中。
而且,我已经检查了,并且在我的应用中拥有这些权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
当我调用create DB方法时,我得到了这个例子:
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 1294): Could not open database
#################################################################
Error Code : 1294 (SQLITE_CANTOPEN_ENOENT)
Caused By : Specified directory or database file does not exist.
(unknown error (code 1294): Could not open database)
#################################################################
您知道为什么不创建数据库吗?
compileSdkVersion 25
buildToolsVersion '26.0.2'
useLibrary 'org.apache.http.legacy'
defaultConfig {
multiDexEnabled true
minSdkVersion 16
targetSdkVersion 18
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
renderscriptTargetApi 22
renderscriptSupportModeEnabled true
}
我还添加了构建gradle文件
答案 0 :(得分:1)
由于文件或目录不存在,无法打开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+ requested permission。
我个人只是添加了此类:-
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);
}
答案 1 :(得分:0)
这可能是您要寻找的路径:
String path = this.getContext().getDatabasePath("database.db").getAbsolutePath();
类似于/data/user/0/appname/databases/database.db
。