0

我有一个应用程序,我正在尝试在其中设置一个相当大的 SQLite 数据库(一个大约有 5000 行的表)。我已经构建了数据库类和所有内容,当我在较小规模(400 行)上进行测试时,我的应用程序可以工作,但是现在当我想导入我的数据库时,我得到了我似乎找不到的内存不足错误一种解决方法。

该数据库最初位于我的 Web 服务器上的 MySQL 上,由于某种奇怪的原因我无法转换它,但我设法生成了一个带有查询的文本文件,以添加所有 5000 行,大小为 11.5mb。我的资产文件夹中有这个文件,我正在尝试将它放入我的数据库中:

public void onHandleIntent(Intent intent) {

        DBAdapter db = new DBAdapter(getApplicationContext());
        db.open();

        try {
            InputStream is = getAssets().open("verbs_sql.txt");
            db.executeSQL(convertStreamToString(is));
        } catch (IOException e) {}

        db.close();

        // Run main activity
        Intent i = new Intent(DatabaseReceiver.this, BaseActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        DatabaseReceiver.this.startActivity(i);
    }

    public static String convertStreamToString(InputStream is) throws IOException {
        Writer writer = new StringWriter();

        char[] buffer = new char[2048];
        try {
            Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        String text = writer.toString();
        return text;
    }
}

StringWriter() 发生内存不足错误,因此看起来像是将那个大文件放到内存中。我该如何解决这个问题?我也尝试过遍历所有 5000 行,但大约 30 秒后,我再次出现内存不足。

4

3 回答 3

1

我有同样的问题。我尝试了很多方法来解决它,但都失败了。最后我找到了原因,我想知道。在我的情况下,错误的原因是我在 log cat 中打印了整个响应字符串。该数据非常庞大,并且占用了堆内存。请注意以下事项

  1. 删除批量数据的 Log cat 打印。
  2. 尝试仅对一个响应下的所有操作使用一个 J-SON 阵列(全部重用)。
  3. 尽量避免使用数组列表。
  4. 当每个项目从 J-Son 数组迭代时插入项目。这意味着不要遵循我们将项目作为对象并将其放入数组列表并将数组列表传递给 DB-helper 并从那里迭代对象并插入的方法。
于 2015-02-03T11:29:04.330 回答
0

Sqlite 数据库只是文件,当您尝试在手机上运行数千次插入时,您会一遍又一遍地使用 SD 卡进行文件访问。

您要做的是在桌面上创建 sqlite 数据库,并将已创建的数据库包含在应用程序中。如果您需要定期更新数据库中的信息,您可以将其发布在网站上并让应用程序下载它,只需确保仅通过 Wifi 进行大量下载。

查看此技术讲座了解更多信息。

编辑:有关在 Windows 中创建 sqlite 数据库并将其包含在您的应用程序中的更多信息,请参阅此内容。

于 2012-06-03T01:50:59.257 回答
0

我相信你可以按照你想要的方式做到这一点。您发布的代码的问题是您试图将整个文件转换为字符串。我相当肯定即使在台式机上这也会失败。

如果您尝试一次阅读一行并执行 SQL,我相信您会获得更好的运气。然后阅读下一行。您还可以通过 zip 传递文件来减小文件的大小。

如果我能找到几分钟,我会附上一些代码。

于 2012-06-03T02:03:35.107 回答