使用 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 检索数据的奇怪行为

SQLite 数据库查询和 AsyncTask

async Task.Run lambda 表达式在 Android 上使 Unity AR 应用程序崩溃,但在 iOS 上运行良好

如果我在 AsyncTask 线程中插入数据,如何从 UI 线程访问 SQLite 数据库?

SQlite数据库操作和AsyncTask [重复]

应用程序关闭后后台进程(AsyncTask)仍在运行