我的应用程序的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);
}
}
如何使用SQLiteAssetHelper完成此操作?
删除旧数据库,然后在SQLiteAssetHelper
上调用getReadableDatabase()
或getWriteableDatabase()
。您可以在任何方便的Context
上调用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();
}
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();
}