0

我想导入一个大于 10 MB 的数据库。我还没有在互联网上找到解决方案......此外,我想将此数据库插入最终的 APK 中。你有什么想法 ?

对不起我的英语不好。我是法国人

4

3 回答 3

1

基本上我曾经为类似数据库所做的就是这里描述的事情。您创建数据库并将其放在您的assets文件夹中。然后将SQLiteOpenHelper其复制到应用程序数据库应驻留的位置(即私有应用程序存储)。

但是,对于这么大的文件,我需要将数据库文件拆分为几个文件,如此所述,因为无法从assets文件夹中读取大于 1MB 的文件。但是,您应该知道,您的 apk 当然会变得非常大。

于 2012-04-27T07:39:36.570 回答
0

我认为您要么必须:

  1. 将插入语句硬编码到应用程序中,以便在应用程序安装时执行此功能,或者
  2. 在网络上托管数据库并让您的应用程序将数据拉入其数据库。
  3. 在网络上托管数据库并让您的应用程序仅获取它需要的数据,然后您可以将其保存到应用程序数据库中(我认为这是我的解决方案的最佳解决方案)
于 2012-04-27T07:35:18.997 回答
-1

可以使用 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();
        }
    }
于 2012-04-27T07:35:34.073 回答