我想在sdcard而不是默认路径中创建我的sqlite数据库...我想从sdcard访问我的所有数据 我使用过此代码:
private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "
+ TABLE_NAME
+ " (id INTEGER PRIMARY KEY, name TEXT, number TEXT, skypeId TEXT, address TEXT, image BLOB)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
问题:
当我在默认路径中看到数据库文件时,我可以看到所有数据 和表,但当我看到在SD卡中创建的数据库文件时 不显示任何数据,但只显示数据库文件
IN构造函数它只在sdcard中创建文件,但在默认路径中它可以很好地完成所有工作..... 如何将所有Sqlitedata存储在SD卡上以便进一步访问?
答案 0 :(得分:43)
我用
创建了我的数据库 public DatabaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator + FILE_DIR
+ File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}
并且没有进一步的问题。我猜你对super()的调用也应该引用sdcard。
答案 1 :(得分:2)
您在super()
电话中提供的名称不完整。尝试使用:
OpenHelper(Context context) {
super(context, "/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);
}
除此之外,您应该始终使用Environment.getExternalStoreDirectory()
来获取外部存储的路径,并且还应该在尝试使用外部存储之前检查外部存储的状态。 / p>
答案 2 :(得分:1)
public DataBaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}
**Also Add permission in android Manifest
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />**
答案 3 :(得分:0)
只需在构造函数中提供路径;
DatabaseHelper(Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator + "/DataBase/" + File.separator
+ DB_NAME, null, DB_VERSION);
}
答案 4 :(得分:0)
从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。此方法简化了应用安装过程,因为用户在安装或更新应用时无需授予权限。
要在运行时获取权限,您必须请求用户。你可以通过以下方式做到这一点。
首次请求权限。
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions, WRITE_REQUEST_CODE);
然后你可以检查
中的结果@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case WRITE_REQUEST_CODE:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
//Permission granted.
//Continue with writing files...
}
else{
//Permission denied.
}
break;
}
}
这是一个很好的学习资源requesting-runtime-permissions-in-android-marshmallow/
答案 5 :(得分:0)
不推荐使用Environment.getExternalStorageDirectory()方法,
API级别29中不推荐使用此方法。为提高用户隐私, 不建议直接访问共享/外部存储设备。什么时候 一个应用程序定位到Build.VERSION_CODES.Q,由此返回的路径 方法不再可供应用直接访问。应用程序可以继续 通过迁移到来访问存储在共享/外部存储中的内容 替代方案,例如Context#getExternalFilesDir(String),MediaStore, 或Intent#ACTION_OPEN_DOCUMENT。
现在我们必须使用getExternalFilesDir(),这是一个示例:
public class MyDataBaseHelper extends SQLiteOpenHelper {
//Constructor
MyDataBaseHelper(Context context) {
super(context, context.getExternalFilesDir()
+ File.separator + "/Database/" + File.separator
+ DATABASE_QUESTION, null, DATABASE_VERSION);
}
...
...
}