如何将sqlite数据库直接存储在存储卡上



我想在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);
    }
   ...
   ...
}

最新更新