10MBを超えるデータベースをインポートしたいのですが。インターネットで解決策が見つかりませんでした...さらに、このDBを最終的なAPKに挿入したいと思います。あなたはなにか考えはありますか ?
英語でごめんなさい。私はフランス人です
基本的に、同様のデータベースに対して一度行ったことは、ここで説明したことでした。データベースを作成し、assets
フォルダーに配置します。次にSQLiteOpenHelper
、アプリケーション データベースが存在する場所 (つまり、プライベート アプリケーション ストレージ) にコピーします。
ただし、大きなファイルの場合、ここで説明するように、データベース ファイルをいくつかのファイルに分割する必要がありました。これは、1 MB を超えるファイルをassets
フォルダーから読み取ることができないためです。ただし、もちろん、apk が非常に大きくなることに注意する必要があります。
次のいずれかを行う必要があると思います。
ZipInputStream を使用して大きなファイルを処理できます。zip util を使用して、ファイルをプロジェクトのアセット フォルダーに圧縮します。
InputStream dataSource = getAssets().open("assets.zip");
unzip(dataSource, MainTab1Activity.defaultDBPath);
public static void unzip(InputStream zipFileName, String outputDirectory) {
try {
ZipInputStream in = new ZipInputStream(zipFileName);
// 获取ZipInputStream中的ZipEntry条目,一个zip文件中可能包含多个ZipEntry,
// 当getNextEntry方法的返回值为null,则代表ZipInputStream中没有下一个ZipEntry,
// 输入流读取完成;
ZipEntry entry = in.getNextEntry();
while (entry != null) {
// 创建以zip包文件名为目录名的根目录
File file = new File(outputDirectory);
file.mkdir();
System.out.println("file.mkdir()");
if (entry.isDirectory()) {
String name = entry.getName();
name = name.substring(0, name.length() - 1);
file = new File(outputDirectory + File.separator + name);
file.mkdir();
} else {
file = new File(outputDirectory + File.separator + entry.getName());
file.createNewFile();
FileOutputStream resultFileOutput = new FileOutputStream(file);
byte[] buf = new byte[1024 * 1024];// 设定缓冲区大小
int bsize = 0;
while ((bsize = in.read(buf)) != -1) {
resultFileOutput.write(buf, 0, bsize);
}
//in.close();
resultFileOutput.close();
System.gc();
// FileOutputStream out = new FileOutputStream(file);
// int b;
// while ((b = in.read()) != -1) {
// out.write(b);
// }
// out.close();
}
// 读取下一个ZipEntry
entry = in.getNextEntry();
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}