我将数据库复制到外部存储器。但它没有源表
问题描述:
我从内部存储器复制数据库到外部,但似乎有什么错误。因为里面没有桌子。 我觉得只是一个空文件被创建。 同时,我用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();
}
}
答
不知道有关的所有设备同样的事情(我用的LG智能手机进行测试) 问题是的扩展文件(.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";
但第一种方法似乎是更安全的
是什么让你认为它没有表?上述代码都没有尝试将数据库看作是一个sqlite数据库,它只是将其视为普通文件。 – MikeT
你好。我看到复制数据库与sqlite3命令行程序。但没有表中。 – hassan
当数据库不存在时,您可能会用sqlite命令/方法打开数据库,因此数据库已经创建而没有表。例如'SQLiteDatabase db = openOrCreateDatabase(“mydb”,MODE_PRIVATE,null);'会做到这一点。 – MikeT