2014-09-04 24 views
2

我在我的应用程序的src/main/assets/databases目录中有一个数据库文件。我想下载整个数据库的新副本(不需要保留任何数据),并覆盖旧数据库。我怎样才能做到这一点SQLiteAssetHelper如何替换(覆盖整个文件)由SQLiteAssetHelper提供的sqlite数据库?

我的理解是,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); 
    } 

} 

回答

3

我怎样才能做到这一点与SQLiteAssetHelper?

删除旧的数据库,然后调用您的SQLiteAssetHelpergetReadableDatabase()getWriteableDatabase()。您可以在任何便利的Context上拨打deleteDatabase()来删除现有的数据库。尽管如此,请确保您的数据库首先关闭。

+0

我可能没有明确。我想从URL下载一个新的数据库文件(我知道该怎么做),但是一旦我有了新文件,我该如何覆盖数据库?我不想覆盖使用'assets'文件夹中已经存在的数据库。 – BLuFeNiX 2014-09-04 20:51:20

+0

@BLuFeNiX:使用'getDatabasePath()'找出在哪里写它,并写在那里。 'SQLiteAssetHelper'与这个过程无关。 – CommonsWare 2014-09-04 20:52:45

+0

谢谢,我会尝试。 – BLuFeNiX 2014-09-04 20:53:05

0

您可以获取文件路径到您的数据库文件并覆盖存储中的另一个文件。

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(); 
} 
相关问题