在调用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" />
其实上面的都没有解决我的问题,我的问题主要出在了数据库的结构不符合android中数据库类SQLiteDatabase对数据库结构的要求,即由于使用SQLiteStudio工具开发的数据库,所以在创建数据库中的表中列的数据类型时使用了如:varchar、nvarchar等数据类型,但是SQLiteDatabase对数据库的要求中不能出现该中类型,查找了好多资料都没有解决我的问题,通过反复对比SQLiteDatabase类中通过SQL语句创建的数据库(此数据库打开时是正常的,没有出现如
标题所示的错误),发现了出现如标题所示错误的数据库在创建数据表中的列的数据类型有异样的情况,通过修改数据列的类型(如将varchar、nvarchar类型该为TEXT类型),解决了如标题所出现的错误。
在androidStudio工具中,如题所示的错误提示太粗略了,几乎很难排查出我的错误原因(网上给出的解决方法几乎全部试了一遍,没有解决),好辛苦,终于解决了该问题。
现给出“Android中SQLite数据库的数据类型”的链接地址介绍,Android中SQLite数据库的数据类型