Android内存不足错误:如何解决?
我有一个应用程序,我正试图在其中设置一个相当大的SQLite数据库(一个表大约有5000行)。我已经构建了DB类和所有东西,当我在较小规模(400行)上测试时,我的应用程序可以工作,但现在当我想导入数据库时,我遇到了内存不足错误,我似乎找不到解决方法 数据库最初是在我的web服务器上的MySQL上,出于一些奇怪的原因,我无法转换它,但我设法生成了一个文本文件,其中包含了添加所有5000行的查询,大小为11.5mb。我的资产文件夹中有此文件,我正在尝试将其放入数据库: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
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中打印整个响应字符串。这些数据非常庞大,占用了堆内存。 注意以下几点
因此,我应该在外部创建一个SQL文件,将其放在assets文件夹中,然后了解如何在DB类中使用该SQL文件?查看有关创建sqlite数据库和在Android应用程序中读取该数据库的完整说明。使用链接中提到的数据库管理器,我成功地在一个文件中创建了我的数据库,并完成了指南的其余部分:)谢谢这段视频现在已经严重过时和不相关了。