我将数据库复制到外部存储。但它没有源表

时间:2017-10-15 11:34:01

标签: android sqlite file copy

我将数据库从内部存储器复制到外部,但似乎出现了问题。因为里面没有桌子。 我觉得只创建了一个空文件。 同时,我使用ActiveAndroid创建源数据库文件并使用Filechanel复制文件

public class DbExportImport {

/** Directory that files are to be read from and written to **/
protected static final File DATABASE_DIRECTORY =
        new File(Environment.getExternalStorageDirectory(),"mydirectory");

public static final String PACKAGE_NAME = "example.com.testp";

public static final String DATABASE_NAME = "database1.db";

/** Contains: /data/data/com.example.app/databases/example.db **/
private static final File DATA_DIRECTORY_DATABASE =
        new File(Environment.getDataDirectory() +
                "/data/" + PACKAGE_NAME +
                "/databases/" + DATABASE_NAME );

public static  boolean exportDb(){

  // if external torage is present
  if( ! SdIsPresent() ) return false;

    File dbFile = DATA_DIRECTORY_DATABASE;

    String filename = "backupdb.db";

    File exportDir = DATABASE_DIRECTORY;

    File file = new File(exportDir, filename);

    if (!exportDir.exists()) {
        exportDir.mkdirs();
    }

    try {
        file.createNewFile();
        copyFile(dbFile, file);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}


private static void copyFile(File src, File dst) throws IOException {

    FileChannel inChannel = new FileInputStream(src).getChannel();

    FileChannel outChannel = new FileOutputStream(dst).getChannel();

    try {
                  inChannel.transferTo(0, inChannel.size(), outChannel);
    } finally {
        if (inChannel != null)
            inChannel.close();
        if (outChannel != null)
            outChannel.close();
    }
}

1 个答案:

答案 0 :(得分:0)

不确定所有设备上的相同内容(我使用LG SmartPhone进行测试) 问题是文件(.db)的扩展。我们不应该写它来访问私有存储/数据/数据中的数据库...... 我使用了context.getDatabasePath()以安全的方式获取数据库路径。 在exportDb函数中,我使用copyFile(context.getDatabasePath("database1"),file)而不是copyFile(dbFile, file); 或者您可以将public static final String DATABASE_NAME = "database1.db";更改为public static final String DATABASE_NAME = "database1"; 但第一种方法似乎更安全