Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android内存不足错误:如何解决?_Android_Sqlite_Io_Out Of Memory_Stringwriter - Fatal编程技术网

Android内存不足错误:如何解决?

Android内存不足错误:如何解决?,android,sqlite,io,out-of-memory,stringwriter,Android,Sqlite,Io,Out Of Memory,Stringwriter,我有一个应用程序,我正试图在其中设置一个相当大的SQLite数据库(一个表大约有5000行)。我已经构建了DB类和所有东西,当我在较小规模(400行)上测试时,我的应用程序可以工作,但现在当我想导入数据库时,我遇到了内存不足错误,我似乎找不到解决方法 数据库最初是在我的web服务器上的MySQL上,出于一些奇怪的原因,我无法转换它,但我设法生成了一个文本文件,其中包含了添加所有5000行的查询,大小为11.5mb。我的资产文件夹中有此文件,我正在尝试将其放入数据库: public void on

我有一个应用程序,我正试图在其中设置一个相当大的SQLite数据库(一个表大约有5000行)。我已经构建了DB类和所有东西,当我在较小规模(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秒后,我的内存又用完了。

在谷歌的这段视频中:

描述了存储器管理。由于您的方法在小规模上工作,因此听起来您使用的内存比应用程序的可用堆要多


视频解释了内存管理以及如何增加堆大小(相信它来自Android 4.0及更高版本)。

Sqlite数据库只是文件,当你试图在手机上运行数千个插件时,你正在反复敲击SD卡以访问文件

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

查看此以了解更多信息


编辑:有关在windows中创建sqlite数据库并将其包含在应用程序中的详细信息,请参阅。

我相信您可以按照自己的方式完成此操作。您发布的代码的问题是,您试图将整个文件转换为字符串。我相当肯定,即使在台式机上,这也会失败

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


如果我能抽出几分钟的时间,我会附上一些代码。

我也遇到了同样的问题。我尝试了很多方法来解决它,但都失败了。最后我找到了原因,我想知道。在我的例子中,错误的原因是我在log cat中打印整个响应字符串。这些数据非常庞大,占用了堆内存。 注意以下几点

  • 删除批量数据的日志cat打印
  • 尝试在一个响应下对所有操作仅使用一个J-SON阵列(对所有操作重复使用)
  • 尽量避免使用数组列表
  • 当每个项从J-Son数组迭代时插入项。这意味着不要遵循将项作为对象并将其放入数组列表并将数组列表传递给DB helper的方法,然后从那里迭代对象并插入

  • 因此,我应该在外部创建一个SQL文件,将其放在assets文件夹中,然后了解如何在DB类中使用该SQL文件?查看有关创建sqlite数据库和在Android应用程序中读取该数据库的完整说明。使用链接中提到的数据库管理器,我成功地在一个文件中创建了我的数据库,并完成了指南的其余部分:)谢谢这段视频现在已经严重过时和不相关了。