【问题标题】:Exception while using SQLiteAssetHelper class使用 SQLiteAssetHelper 类时出现异常
【发布时间】:2018-04-04 12:51:54
【问题描述】:

我正在尝试使用 SQLiteAssetHelper 将我预先填充的数据库复制到 Android 应用程序中。我的设备上有 Android-7(Nvidia Shield 和摩托罗拉手机)。从 Settings->App->MyApp 我启用了 CalenderLocationStorage 权限

我在 Manifest 文件中也有以下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

当我将数据库保存在 assets/databases/databases 文件夹中时,我得到以下异常:

原因:com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException:无法将 /data/user/0/com.funcheap.funmapsf/databases/databases/MySFfuncheapDatabase.db 写入数据

当我将数据库保存在 assets/databases 文件夹中时,我得到以下异常:

原因:com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException:资产中缺少数据库/数据库/MySFfuncheapDatabase.db 文件(或 .zip、.gz 存档),或目标文件夹不可写

不幸的是,SO question 对我没有帮助

【问题讨论】:

  • 您不需要该权限即可写入应用的内部存储区域 (/data/.../&lt;your app&gt;/...)。这仅用于外部存储(通常是/storage/emulated/0/...
  • 请提供minimal reproducible example,特别是显示您的SQLiteAssetHelper 子类。我认为您的问题出在您提供给 SQLiteAssetHelper 构造函数的数据库名称中。如何使用SQLiteAssetHelper,请参阅this sample app
  • 会不会是因为路径包含两次databases目录?即是否应该使用/data/user/0/com.funcheap.funmapsf/databases/MySFfuncheapDatabase.db 而不是/data/user/0/com.funcheap.funmapsf/databases/databases/MySFfuncheapDatabase.db

标签: android android-sqlite android-7.0-nougat android-assets


【解决方案1】:

正如@miket 所说,如果您引用内部路径 Android 将使用该引用,我遇到了这个问题,这是我非常草率的测试代码 注意注释掉的调用

public void getINTERNAL(){
    Context context = this;
    File file = new File(context.getFilesDir().getAbsolutePath());
    String NT = String.valueOf(file);
    THE_PATH = NT+"/";
    System.out.println("INTERNAL PATH =========> "+THE_PATH);
}


public void getAvailable(){

    //getINTERNAL();

    String state = Environment.getExternalStorageState();

    if (state.equals(Environment.MEDIA_MOUNTED) && (!state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))) {

        File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
        THE_PATH = String.valueOf(removable);
        if(THE_PATH.length() > 4) {
            //THE_PATH = THE_PATH.substring(0, THE_PATH.length() - 5);
            THE_PATH = THE_PATH + "/Documents/";
            System.out.println("new path ====> "+THE_PATH);
        }
        System.out.println("EXTERNAL PATH ====> " + THE_PATH);
        System.out.println("Internal Path used if EXTERNAL PATH = NULL ");
        //getINTERNAL(); DO NOT CALL HERE YOU WILL CHANGE THE_PATH TO internal
        // no need to set THE_PATH for internal storage it will default on its own
        // WHY DOES THIS HAPPEN THE_PATH variable is PUBLIC STATIC hence it is GLOBAL
    }
}

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 2011-10-15
    • 2015-02-05
    • 2014-08-06
    • 1970-01-01
    • 2011-09-15
    • 2016-11-08
    • 2011-08-11
    • 2011-09-30
    相关资源
    最近更新 更多