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

时间:2013-01-17 07:09:09

标签: android sqlite android-sqlite

我想在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卡上以便进一步访问?

6 个答案:

答案 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);
    }
   ...
   ...
}