Android 如何替换(覆盖整个文件)SQLiteAssetThelper提供的sqlite数据库?

Android 如何替换(覆盖整个文件)SQLiteAssetThelper提供的sqlite数据库?,android,database,sqlite,updates,assets,Android,Database,Sqlite,Updates,Assets,我的应用程序的src/main/assets/databases目录中有一个数据库文件。我想下载整个数据库的新副本(不需要保留任何数据),然后覆盖旧的副本。如何使用SQLiteAssetHelper 我的理解是,SQLiteAssetHelper检查数据库是否“安装”在设备上,如果没有,则将其从src/main/assets/databases目录中取出,并复制到安卓可以使用的地方。既然我不能修改我的应用程序的资产,那么SQLiteAssetHelper在哪里复制数据库,什么是覆盖数据库的正确方

我的应用程序的
src/main/assets/databases
目录中有一个数据库文件。我想下载整个数据库的新副本(不需要保留任何数据),然后覆盖旧的副本。如何使用
SQLiteAssetHelper

我的理解是,
SQLiteAssetHelper
检查数据库是否“安装”在设备上,如果没有,则将其从
src/main/assets/databases
目录中取出,并复制到安卓可以使用的地方。既然我不能修改我的应用程序的资产,那么
SQLiteAssetHelper
在哪里复制数据库,什么是覆盖数据库的正确方法

这是我的扩展的
SQLiteAssetHelper
,以防有任何用处:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class EnumDatabase extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "enums.sqlite3";
    private static final int DATABASE_VERSION = 1;

    public EnumDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

}
如何使用SQLiteAssetHelper实现这一点


删除旧数据库,然后在
sqliteassetlper
上调用
getReadableDatabase()
getWriteableDatabase()
。您可以在任何方便的
上下文中调用
deleteDatabase()
,以删除现有数据库。不过,请确保先关闭数据库。

您只需获取数据库文件的文件路径,然后用存储中的另一个文件覆盖它即可

public class MyDatabase extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "wl.db";
    private static final int DATABASE_VERSION = 1;  
    public String databasePath = "";    

    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        databasePath = context.getDatabasePath("wl.db").getPath();
    }


我可能不太清楚。我想从URL下载一个新的数据库文件(我知道该怎么做),但一旦我有了新文件,我该如何覆盖数据库?我不想使用
assets
文件夹中已经存在的数据库进行覆盖。@BLuFeNiX:使用
getDatabasePath()
确定在何处写入它,并将其写入其中
SQLiteAssetPer
与此过程无关。谢谢,我会试试。@Commonware,如果我们使用的是ContentProvider,我们将如何关闭数据库?@hitch.united:通常,您永远不会关闭由
ContentProvider
管理的数据库,因为您很少知道什么时候是关闭数据库的正确时机。
String toPath = db.databasePath;
if (Environment.getExternalStorageState() != null) {
    File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyAppFolder");
    String fromPath = dir.getAbsolutePath() + "/wl.db";
    fileCopy(new File(fromPath), new File(toPath));
}


public void fileCopy(File src, File dst) throws IOException {
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst);

    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    out.flush();
    in.close();
    out.close();
}