使用 AsyncTask 运行 Sqlite ArrayList<Float> 查询
Posted
技术标签:
【中文标题】使用 AsyncTask 运行 Sqlite ArrayList<Float> 查询【英文标题】:Sqlite ArrayList<Float> query run with AsyncTask 【发布时间】:2017-04-01 07:54:34 【问题描述】:我正在尝试为我的应用创建图表,但无法将数据加载到图表中。它给了我一个内存不足的错误。然后我一直在尝试使用 AsyncTask 在后台线程中运行 SQLite 查询。我试过但无法正确创建它。我在这里发布我的代码,希望有人可以帮助我。非常感谢!!!!
这里是错误信息:
java.lang.OutOfMemoryError: Failed to allocate a 103059952 byte allocation with 4194304 free bytes and 53MB until OOM
at java.util.ArrayList.add(ArrayList.java:118)
这是我的代码中为我提供数据源的部分。我正在从 SQLite 数据库中提取数据。查询有效。我测试过。我需要编写通过 AsyncTask 在后台线程中运行查询的代码。
public ArrayList<Float> yData()
ArrayList<Float> ynewData=new ArrayList<Float>();
SQLiteDatabase db=this.getReadableDatabase();
String sql="select sum("+ TableData.TableInfo.COL_S4_AMT+") MonthPieCHartCategoryValues,c."+ TableData.TableInfo.COL_C2_Description+" Category from "+ TableData.TableInfo.DataBase_Table_Spending+" s join "+ TableData.TableInfo.DataBase_Table_Items+" i on i."+ TableData.TableInfo.COL_I1_ItemID+"=s."+ TableData.TableInfo.COL_S3_ItemID+ " join "+ TableData.TableInfo.DataBase_Table_Category+" c on c."+ TableData.TableInfo.COL_C1_CategoryID+"=i."+ TableData.TableInfo.COL_I3_CategoryID + " where strftime('%Y',"+ TableData.TableInfo.COL_S2_Spending_DT+")=strftime('%Y',Date('now')) and strftime('%m',"+ TableData.TableInfo.COL_S2_Spending_DT+")=strftime('%m',date('now')) group by c."+ TableData.TableInfo.COL_C2_Description+" order by Category desc";
Cursor cursor=db.rawQuery(sql,null);
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToLast())
ynewData.add(cursor.getFloat(cursor.getColumnIndex(MonthPieCHartCategoryValues)));
cursor.close();
return ynewData;
【问题讨论】:
显然是因为您刚刚创建了无限循环...在此处提问之前检查您的条件两次 无限循环?哪一部分?我是 android 和 Java 新手。 似乎你的逻辑基础有问题......如果你在每次迭代中将某些东西移到最后一个位置,你将永远不会达到“后一个”位置 我对这个领域和学习非常陌生。谢谢你的耐心!!这段代码告诉我什么:for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToLast()) 这段代码告诉我什么:...我不知道,你写的... 【参考方案1】:正如 Selvin 所说,您的循环将无限次运行,因为您在每次循环运行后都移动到最后一个元素。试试这样的:
cursor.moveToFirst();
while(!cursor.isAfterLast())
ynewData.add(cursor.getFloat(cursor.getColumnIndex(MonthPieCHartCategoryValues)));
cursor.moveToNext();
cursor.close();
【讨论】:
非常感谢拉里!!我今晚试试,明天回复你。以上是关于使用 AsyncTask 运行 Sqlite ArrayList<Float> 查询的主要内容,如果未能解决你的问题,请参考以下文章
在 AsyncTask 上尝试使用 SQLite 检索数据的奇怪行为
async Task.Run lambda 表达式在 Android 上使 Unity AR 应用程序崩溃,但在 iOS 上运行良好