20

我想在 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 卡中创建的数据库文件时,它不显示任何数据,而只显示数据库文件

在构造函数中,它只在 sdcard 中创建文件,但在默认路径中它做得很好.....如何将所有 Sqlitedata 存储在 sdcard 上以供进一步访问?

4

6 回答 6

44

我创建了我的数据库

    public DatabaseHelper(final Context context) {
    super(context, Environment.getExternalStorageDirectory()
            + File.separator + FILE_DIR
            + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}

并且没有进一步的问题。我猜你对 super() 的调用也应该引用 sdcard。

于 2013-01-17T07:15:53.583 回答
2

您在super()通话中提供的姓名不完整。尝试使用:

OpenHelper(Context context) {
    super(context, "/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION);
    SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);

}

除此之外,您应该始终使用Environment.getExternalStoreDirectory()获取外部存储的路径,并且您还应该在尝试使用之前检查外部存储的状态。

于 2013-01-17T07:17:14.233 回答
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" />**
于 2015-03-11T06:47:50.903 回答
0

只需在构造函数中给出路径;

 DatabaseHelper(Context context) {
    super(context, Environment.getExternalStorageDirectory()
            + File.separator + "/DataBase/" + File.separator
            + DB_NAME, null, DB_VERSION);
}
于 2017-07-28T11:06:57.133 回答
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/

于 2018-05-08T21:40:28.773 回答
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);
    }
   ...
   ...
}
于 2020-02-14T02:36:31.757 回答