代码之家  ›  专栏  ›  技术社区  ›  chrisonline

将sqlite数据库备份并还原到SD卡

  •  12
  • chrisonline  · 技术社区  · 15 年前

    如何在应用程序中将数据库自动备份到SD卡? 之后,我如何恢复它?

    4 回复  |  直到 9 年前
        1
  •  11
  •   chrisonline    15 年前

    这是我的代码:

        // Local database
        InputStream input = new FileInputStream(from);
    
        // create directory for backup
        File dir = new File(DB_BACKUP_PATH);
        dir.mkdir();
    
        // Path to the external backup
        OutputStream output = new FileOutputStream(to);
    
        // transfer bytes from the Input File to the Output File
        byte[] buffer = new byte[1024];
        int length;
        while ((length = input.read(buffer))>0) {
            output.write(buffer, 0, length);
        }
    
        output.flush();
        output.close();
        input.close();
    
        2
  •  10
  •   CommonsWare    15 年前

    如何将数据库备份到 SD卡自动进入我的应用程序?

    使用标准的Java I/O复制它,确保您没有任何打开。 SQLiteDatabase 但是,对象。

    然后我如何恢复它?

    使用标准的Java I/O复制它,确保您没有任何打开。 数据操作 不过,对象是旧数据库的。

    你可以使用 getPath() 在一 数据操作 对象以确定其所在位置,afaik(尚未尝试此操作)。

        3
  •  8
  •   Denny Weinberg    9 年前

    感谢现有的答案。以下是完整的类(使用“getdatabasepath”):

    package com.levionsoftware.bills.data.db;
    
    import android.content.Context;
    import android.os.Environment;
    import android.widget.Toast;
    
    import com.levionsoftware.bills.MyApplication;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.nio.channels.FileChannel;
    
    /**
     * Created by denny on 16/05/2016.
     * Source: http://stackoverflow.com/questions/18322401/is-it-posible-backup-and-restore-a-database-file-in-android-non-root-devices
     */
    public class BackupAndRestore {
        public static void importDB(Context context) {
            try {
                File sd = Environment.getExternalStorageDirectory();
                if (sd.canWrite()) {
                    File backupDB = context.getDatabasePath(DBHandler.getDBName());
                    String backupDBPath = String.format("%s.bak", DBHandler.getDBName());
                    File currentDB = new File(sd, backupDBPath);
    
                    FileChannel src = new FileInputStream(currentDB).getChannel();
                    FileChannel dst = new FileOutputStream(backupDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();
    
                    MyApplication.toastSomething(context, "Import Successful!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void exportDB(Context context) {
            try {
                File sd = Environment.getExternalStorageDirectory();
                File data = Environment.getDataDirectory();
    
                if (sd.canWrite()) {
                    String backupDBPath = String.format("%s.bak", DBHandler.getDBName());
                    File currentDB = context.getDatabasePath(DBHandler.getDBName());
                    File backupDB = new File(sd, backupDBPath);
    
                    FileChannel src = new FileInputStream(currentDB).getChannel();
                    FileChannel dst = new FileOutputStream(backupDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();
    
                    MyApplication.toastSomething(context, "Backup Successful!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
        4
  •  2
  •   Community Mohan Dere    8 年前

    https://stackoverflow.com/a/18322762/293280

    上面关于一个重复问题的答案提供了一个很好的例子,可以将您的sqlite dbs导入和导出到SD卡。看一看。

    推荐文章