Android 如何从外部文件替换(覆盖)DB

Android 如何从外部文件替换(覆盖)DB,android,sqlite,onupdate,Android,Sqlite,Onupdate,我想从特定路径将旧基替换为新基。我应该删除旧版本而只复制新文件吗?它的工作,但应用程序应用新的基地后,我清除现金或重新启动设备。为什么会这样?或者我应该使用dbHelper.onUpgrade()?可能更好。但是我不能将参数设置为onUpgrade(),因为它需要SQLiteDatabase作为参数,我有到db的文件路径,所以如何设置必要的参数?它应该是这样的: downloadDbPath = file.getPath(); sql = new SQLiteDatabase()

我想从特定路径将旧基替换为新基。我应该删除旧版本而只复制新文件吗?它的工作,但应用程序应用新的基地后,我清除现金或重新启动设备。为什么会这样?或者我应该使用
dbHelper.onUpgrade()
?可能更好。但是我不能将参数设置为
onUpgrade()
,因为它需要
SQLiteDatabase
作为参数,我有到db的文件路径,所以如何设置必要的参数?它应该是这样的:

    downloadDbPath = file.getPath();
    sql = new SQLiteDatabase().getPath(downloadDbPath);
    dbHelper.onUpgrade(sql, 1, 2);

第二行的错误是:SQLiteDatabase()在SQLiteDatabase中不是公共的;无法从外部包访问,因此我无法创建新对象

好的,如果我下一步做的某个人感兴趣: 主要方法:

  public void downloadDb() {
        new FileChooser(this).setFileListener(new FileChooser.FileSelectedListener() {
            @Override public void fileSelected(final File file) {
                downloadDbPath = file.getPath();
                try {
                    InputStream in = new FileInputStream(downloadDbPath);
                    OutputStream out = new FileOutputStream(uploadDbPath);

                    // Transfer bytes from in to out
                    byte[] buf = new byte[1024];
                    int len;
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    deleteCache(context);
                    restartApp();
                    in.close();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).showDialog();
    }
附件:

清除缓存:

文件选择器:

类文件选择器{
私有静态最终字符串PARENT_DIR=“…”;
私人最终活动;
私有列表视图列表;
私人对话;
私有文件路径;
//根据文件扩展名筛选
私有字符串扩展名=null;
公共void集合扩展名(字符串扩展名){
this.extension=(extension==null)?null:
extension.toLowerCase();
}
//文件选择事件处理
公共接口文件SelectedListener{
选择的无效文件(文件);
}
公共文件选择器setFileListener(FileSelectedListener fileListener){
this.fileListener=fileListener;
归还这个;
}
私有文件选择监听器文件监听器;
公共文件选择器(活动){
这个。活动=活动;
对话框=新对话框(活动);
列表=新列表视图(活动);
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@重写公共void onItemClick(AdapterView父级、视图、int-which、长id){
String fileselected=(String)list.getItemAtPosition(which);
File chosenFile=getChosenFile(fileselected);
if(chosenFile.isDirectory()){
刷新(chosenFile);
}否则{
if(fileListener!=null){
fileListener.fileSelected(chosenFile);
}
dialog.dismise();
}
}
});
setContentView(列表);
dialog.getWindow().setLayout(LayoutParams.FILL\u父级,LayoutParams.FILL\u父级);
刷新(Environment.getExternalStorageDirectory());
}
公共对话框(){
dialog.show();
}
/**
*对给定路径的文件进行排序、筛选和显示。
*/
私有无效刷新(文件路径){
this.currentPath=path;
if(path.exists()){
File[]dirs=path.listFiles(新文件过滤器(){
@覆盖公共布尔接受(文件){
return(file.isDirectory()&&file.canRead());
}
});
File[]files=path.listFiles(新文件过滤器(){
@覆盖公共布尔接受(文件){
如果(!file.isDirectory()){
如果(!file.canRead()){
返回false;
}else if(扩展==null){
返回true;
}否则{
返回文件.getName().toLowerCase().endsWith(扩展名);
}
}否则{
返回false;
}
}
});
//转换为数组
int i=0;
字符串[]文件列表;
if(path.getParentFile()==null){
fileList=新字符串[dirs.length+files.length];
}否则{
fileList=新字符串[dirs.length+files.length+1];
fileList[i++]=父目录;
}
数组。排序(dirs);
数组。排序(文件);
对于(File dir:dirs){fileList[i++]=dir.getName();}
对于(File:files){fileList[i++]=File.getName();}
//刷新用户界面
setTitle(currentPath.getPath());
list.setAdapter(新阵列适配器)(活动,
android.R.layout.simple_list_item_1,文件列表){
@覆盖公共视图getView(int pos、视图视图、视图组父视图){
view=super.getView(位置、视图、父级);
((TextView)视图)。设置单行线(true);
返回视图;
}
});
}
}
/**
*将相对文件名转换为实际的文件对象。
*/
私有文件getChosenFile(选择字符串文件){
if(fileselected.equals(PARENT_DIR)){
返回currentPath.getParentFile();
}否则{
返回新文件(currentPath,FileSelected);
}
}
}

好的,如果我下一步做的某个人感兴趣: 主要方法:

  public void downloadDb() {
        new FileChooser(this).setFileListener(new FileChooser.FileSelectedListener() {
            @Override public void fileSelected(final File file) {
                downloadDbPath = file.getPath();
                try {
                    InputStream in = new FileInputStream(downloadDbPath);
                    OutputStream out = new FileOutputStream(uploadDbPath);

                    // Transfer bytes from in to out
                    byte[] buf = new byte[1024];
                    int len;
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    deleteCache(context);
                    restartApp();
                    in.close();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).showDialog();
    }
附件:

清除缓存:

文件选择器:

类文件选择器{
私有静态最终字符串PARENT_DIR=“…”;
私人最终活动;
私有列表视图列表;
私人对话;
私有文件路径;
//根据文件扩展名筛选
私有字符串扩展名=null;
公共void集合扩展名(字符串扩展名){
this.extension=(extension==null)?null:
extension.toLowerCase();
}
//文件选择事件处理
公共接口文件SelectedListener{
选择的无效文件(文件);
}
公共文件选择器setFileListener(FileSelectedListener fileListener){
this.fileListener=fileListener;
归还这个;
}
私有文件选择监听器文件监听器;
公共文件选择器(A)
public void restartApp(){
    Intent mStartActivity = new Intent(context, MainActivity.class);
    int mPendingIntentId = 123456;
    PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
    System.exit(0);
}
class FileChooser {
    private static final String PARENT_DIR = "..";

    private final Activity activity;
    private ListView list;
    private Dialog dialog;
    private File currentPath;

    // filter on file extension
    private String extension = null;
    public void setExtension(String extension) {
        this.extension = (extension == null) ? null :
                extension.toLowerCase();
    }

    // file selection event handling
    public interface FileSelectedListener {
        void fileSelected(File file);
    }

    public FileChooser setFileListener(FileSelectedListener fileListener) {
        this.fileListener = fileListener;
        return this;
    }

    private FileSelectedListener fileListener;

    public FileChooser(Activity activity) {
        this.activity = activity;
        dialog = new Dialog(activity);
        list = new ListView(activity);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override public void onItemClick(AdapterView<?> parent, View view, int which, long id) {
                String fileChosen = (String) list.getItemAtPosition(which);
                File chosenFile = getChosenFile(fileChosen);
                if (chosenFile.isDirectory()) {
                    refresh(chosenFile);
                } else {
                    if (fileListener != null) {
                        fileListener.fileSelected(chosenFile);
                    }
                    dialog.dismiss();
                }
            }
        });
        dialog.setContentView(list);
        dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        refresh(Environment.getExternalStorageDirectory());
    }

    public void showDialog() {
        dialog.show();
    }


    /**
     * Sort, filter and display the files for the given path.
     */
    private void refresh(File path) {
        this.currentPath = path;
        if (path.exists()) {
            File[] dirs = path.listFiles(new FileFilter() {
                @Override public boolean accept(File file) {
                    return (file.isDirectory() && file.canRead());
                }
            });
            File[] files = path.listFiles(new FileFilter() {
                @Override public boolean accept(File file) {
                    if (!file.isDirectory()) {
                        if (!file.canRead()) {
                            return false;
                        } else if (extension == null) {
                            return true;
                        } else {
                            return file.getName().toLowerCase().endsWith(extension);
                        }
                    } else {
                        return false;
                    }
                }
            });

            // convert to an array
            int i = 0;
            String[] fileList;
            if (path.getParentFile() == null) {
                fileList = new String[dirs.length + files.length];
            } else {
                fileList = new String[dirs.length + files.length + 1];
                fileList[i++] = PARENT_DIR;
            }
            Arrays.sort(dirs);
            Arrays.sort(files);
            for (File dir : dirs) { fileList[i++] = dir.getName(); }
            for (File file : files ) { fileList[i++] = file.getName(); }

            // refresh the user interface
            dialog.setTitle(currentPath.getPath());
            list.setAdapter(new ArrayAdapter(activity,
                    android.R.layout.simple_list_item_1, fileList) {
                @Override public View getView(int pos, View view, ViewGroup parent) {
                    view = super.getView(pos, view, parent);
                    ((TextView) view).setSingleLine(true);
                    return view;
                }
            });
        }
    }


    /**
     * Convert a relative filename into an actual File object.
     */
    private File getChosenFile(String fileChosen) {
        if (fileChosen.equals(PARENT_DIR)) {
            return currentPath.getParentFile();
        } else {
            return new File(currentPath, fileChosen);
        }
    }
}