我想在sdcard中创建我的sqlite数据库,而不是默认路径…我也想从存储卡访问我所有的数据我已经使用了这个代码:
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卡中创建的数据库文件时不显示任何数据,只显示数据库文件
在构造函数中,它只在sdcard中创建文件,但在默认路径中,它做得很好.....如何将所有Sqlitedata存储在存储卡上以供进一步访问?
我用
创建了我的数据库 public DatabaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator + FILE_DIR
+ File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}
,并没有进一步的问题。我猜你对super()的调用也应该引用sd卡
您在super()
呼叫中提供了一个不完整的名称。尝试使用:
OpenHelper(Context context) {
super(context, "/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);
}
除此之外,您应该始终使用Environment.getExternalStoreDirectory()
获取外部存储的路径,并且在尝试使用外部存储之前还应该检查外部存储的状态。
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" />**
在构造函数中给出路径;
DatabaseHelper(Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator + "/DataBase/" + File.separator
+ DB_NAME, null, DB_VERSION);
}
从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;
}
}
这是一个很好的学习源request -runtime-permissions-in-android-marshmallow/
不支持使用Environment.getExternalStorageDirectory()方法,
此方法在API级别29中已弃用。为改善用户隐私,不建议直接访问共享/外部存储设备。当一个应用程序的目标是Build.VERSION_CODES。Q,从这里返回的路径方法不再被应用程序直接访问。应用程序可以继续访问存储在共享/外部存储上的内容,方法是迁移到替代方案,如Context#getExternalFilesDir(String), MediaStore,或意图# 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);
}
...
...
}