Android sqlite unknown error |code 14: Could not open database

Android sqlite unknown error |code 14: Could not open database
在调用SQLiteDatabase类的静态方法openOrCreateDatabase时传入的路径参数必须为绝对路径。
这与Activity/ContextThemeWrapper类的openOrCreateDatabase不同。

后者中传入的路径参数为文件名.db,其默认存放在/data/data/包名/databases下,而前者则必须指定绝对路径,若像后者那样直接传入文件名,不仅不能直接保存在/data/data/包名/databases下,还会被理解为直接在根目录保存文件而引发异常。

//直接保存在默认内置存储内 //用Activity.openOrCreateDatabase实现 SQLiteDatabase database; database=MainActivity.this.openOrCreateDatabase("data.db",MODE_PRIVATE,null); //直接保存在默认内置存储内 //用SQLiteDatabase.openOrCreateDatabase实现 SQLiteDatabase database; String dirPath="/data/data/"+MainActivity.this.getPackageName()+"/databases/"; database=SQLiteDatabase.openOrCreateDatabase(dirPath+"data.db",null); //直接保存在外置存储内 //用SQLiteDatabase.openOrCreateDatabase实现 SQLiteDatabase database; String dirPath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/aaa/”; //判断外置存储状态 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) database=SQLiteDatabase.openOrCreateDatabase(dirPath+"data.db",null);
注意:用SQLiteDatabase.openOrCreateDatabase创建数据库前,如果数据库文件.db是存储在未创建的目录下,仍要新建目录,否则也会抛出异常Could not open database
//dirPath是文件夹路径名,不包含文件名,如/storage/emulated/0/aaa String dirPath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/aaa/”; File dir=new File(dirPath); if(!dir.exists()) dir.mkdirs(); SQLiteDatabase database=SQLiteDatabase.openOrCreateDatabase(dirPath+"data.db",null);
最后确保AndroidManifest.xml相关权限的填写
例如:在外置存储读写的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

推荐阅读