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

时间:2014-09-04 20:14:48

标签: android database sqlite updates assets

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

我的理解是SQLiteAssetHelper检查数据库是否已安装"在设备上,如果没有,将其从src/main/assets/databases目录中拉出来并将其复制到android可以使用的地方。由于我无法修改我的应用资产,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);
    }

}

2 个答案:

答案 0 :(得分:3)

  

如何使用SQLiteAssetHelper执行此操作?

删除旧数据库,然后在getReadableDatabase()上致电getWriteableDatabase()SQLiteAssetHelper。您可以在任何方便的deleteDatabase()上调用Context来删除现有数据库。但请确保先关闭数据库。

答案 1 :(得分:1)

您可以获取db文件的文件路径,并使用存储中的其他文件覆盖它。

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();
    }

...

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();
}