本地(桌面上)有一个数据库main.db,后来通过添加data/data//databases/main.db失败,尝试多次未果,不是log.e为空,就是SQLiteDatabase.openDatabase(dbfile,null,SQLiteDatabase.OPEN_READWRITE)路径这一行代码出错,也出现android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database错误(一般都是你数据库存放的路径出错了,找到你的数据库,把路径写正确就没问题了,加油喔~)
解决方案:
//手机内部存储根目录
String SDCARD_DIR = Environment.getExternalStorageDirectory().getPath();
Log.e("note",SDCARD_DIR); //storage/sdcard
String dbfile = SDCARD_DIR+"/Download/main.db"; //我直接手动把main.db按照dbfile的路径放到android 中的file explorer下了
Log.e("note",dbfile);///storage/sdcard/Download/main.db
SQLiteDatabase db = SQLiteDatabase.openDatabase(dbfile,null,SQLiteDatabase.OPEN_READWRITE);
记得在manifest文件中添加权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 允许在外部存储器即SD卡上写数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许在外部存储器即SD卡上读数据 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
如何手动把main.db按照dbfile的路径放到android 中的file explorer下:
找到本地你的数据库,选中就能添加到里边啦~
一些错误值得注意的地方:
/
/ Log.e("111file","111"+context.getDatabasePath("main.db").getPath());
// Log.e("111file","111"+context.getFilesDir().getAbsolutePath()+"/main.db");
// Log.e("111file","111"+context.getCacheDir().getAbsolutePath()+"/main.db");
不知道为什么我这些log.e都出现了空指针错误
// SQLiteDatabase db = SQLiteDatabase.openDatabase("/main.db", null, SQLiteDatabase.OPEN_READWRITE); 错了
// SQLiteDatabase db = SQLiteDatabase.openDatabase(context.getFilesDir().getAbsolutePath()+"main.db", null, SQLiteDatabase.OPEN_READWRITE); 错了
// SQLiteDatabase db = SQLiteDatabase.openDatabase("//data//data//com.android.deskclock//databases//main.db", null, SQLiteDatabase.OPEN_READWRITE);
这一行出现了这个错误:Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
注意:com.android.deskclock是错的,应该写成包名的全称
// SQLiteDatabase db = SQLiteDatabase.openDatabase("//data//data//com.example.androidtest1.dao//databases//main.db", null, SQLiteDatabase.OPEN_READWRITE);
我改成了包名的全称也不对,╮(╯▽╰)╭
// //SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/com.example.androidtest1.dao/databases/main.db", null, SQLiteDatabase.OPEN_READWRITE);
双斜杠和单斜杠都试过了
// SQLiteDatabase db = SQLiteDatabase.openDatabase("C://Users//XXX//Desktop//sql.db", null, SQLiteDatabase.OPEN_READWRITE);
直接写的桌面上的绝对路径(因为我的数据库在桌面上),双斜杠和单斜杠也都试过了
// SQLiteDatabase db = SQLiteDatabase.openDatabase(context.getDatabasePath("main.db").getPath(), null, SQLiteDatabase.OPEN_READWRITE);
换了一种获取方式,错了
// SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("main.db", null); 直接写出错了
// SQLiteDatabase db = dbHelper. getWritableDatabase(); 这个不是很会
一个不错的链接分享(Adnroid文件存储路径getFilesDir()与getExternalFilesDir的区别):https://blog.youkuaiyun.com/losefrank/article/details/53464646