Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在运行时用另一个数据库替换数据库。_Android_Sqlite - Fatal编程技术网

Android 在运行时用另一个数据库替换数据库。

Android 在运行时用另一个数据库替换数据库。,android,sqlite,Android,Sqlite,我有两个数据库,一个是主数据库。此主数据库负责保存最新的当前数据,我的辅助数据库通过cron作业填充。一旦主数据库过时,我想通过一个文件操作将其替换为辅助数据库,该文件操作只需重写现有数据库并刷新我的视图。有没有可能做到这一点,有没有更好的办法 到目前为止,我所做的是: public void writeToSD() throws IOException { File f=new File("/mnt/sdcard/dump.db"); FileInputStre

我有两个数据库,一个是主数据库。此主数据库负责保存最新的当前数据,我的辅助数据库通过cron作业填充。一旦主数据库过时,我想通过一个文件操作将其替换为辅助数据库,该文件操作只需重写现有数据库并刷新我的视图。有没有可能做到这一点,有没有更好的办法

到目前为止,我所做的是:

public void writeToSD() throws IOException {
        File f=new File("/mnt/sdcard/dump.db");
        FileInputStream fis=null;
        FileOutputStream fos=null;

        try{
            fis=new FileInputStream(f);


            fos=new FileOutputStream("/data/data/com.one.two/databases/Bdr");
            while(true){
                int i=fis.read();
                if(i!=-1){
                    fos.write(i);
                }
                else{
                    break;
                }
            }
            fos.flush();

        }
        catch(Exception e){
            e.printStackTrace();

        }
        finally{
            try{
                fos.close();
                fis.close();
            }
            catch(IOException ioe){
                System.out.println(ioe);
            }
        }

如果要使用文件操作,重命名数据库文件会更快。但在文件操作期间,在执行任何操作之前,必须关闭所有连接


如果插入太慢,我不会覆盖数据库文件。我将使用临时名称和相同的表和视图结构生成新数据库。在完成对临时文件的写入之后,我会将该文件重命名为与旧数据库的不变部分相同的名称加上版本号或时间戳。在我的应用程序中,我会定期查找新版本,如果发现,我会关闭与旧文件的所有连接并打开新数据库

对两个SQLiteOpenHelper实例始终使用相同的数据库文件(比如dbA、dbB),并使用类似这样的实用程序类,而不是使用原始SQLiteOpenHelper,怎么样

class Db {
  private SQLiteOpenHelper mPrimaryDb;
  private SQLiteOpenHelper mSecondaryDb;

  public Db(Context context) {
    mPrimaryDb = new MyDbHelper(context, "db_a");
    mSecondaryDb = new MyDbHelper(context, "db_b");
  }

  public SQLiteOpenHelper getPrimaryDb() {
    return mPrimaryDb;
  }

  public SQLiteOpenHelper getSecondaryDb() {
    return mSecondaryDb;
  }

  public void swapDb() {
    SQLiteOpenHelper tmp = mPrimaryDb;
    mPrimaryDb = mSecondaryDb;
    mSecondaryDb = tmp;
    // TODO: notify data users that data has changed, cleanup the old primary database, etc.
  }
{

如果主数据库是最新的,为什么它会过时?更改为第二个db的原因是什么?主db每五分钟就会过时一次。数据值会改变!为什么不动态更新主数据库?因为我一次至少插入20000条记录!!在三个不同的表中,它需要一生!这个想法似乎很棒,但我现在已经使用了事务。他们加快了我的批量插入。我也一定会尝试一下!