SQLiteDatabase与本地数据库连接路径问题

本地(桌面上)有一个数据库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.csdn.net/losefrank/article/details/53464646

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值