gpt4 book ai didi

android - 后台粘性并发标记清除GC sqlite数据库的无限循环

转载 作者:行者123 更新时间:2023-11-29 23:22:50 27 4
gpt4 key购买 nike

我在应用程序中使用 SQLite 数据库,我试图添加一个函数,以 HashMap 的形式从数据库中获取一些数据

 public HashMap<Integer, ArrayList<OrderCustomer>> getOrderCustomers (){
SQLiteDatabase db = getReadableDatabase();
String query = "SELECT * FROM " + TABLE_ORDER_CUSTOMER + " ;";
Cursor cursor = db.rawQuery(query,null);
cursor.moveToFirst();
HashMap<Integer, ArrayList<OrderCustomer>> result = new HashMap<>();

while (!cursor.isAfterLast()){
int fkOrder = cursor.getInt(cursor.getColumnIndex(OC_FK_ORDER));
int fkCustomer = cursor.getInt(cursor.getColumnIndex(OC_FK_CUSTOMER));
double cost = cursor.getDouble(cursor.getColumnIndex(OC_COST));

OrderCustomer orderCustomer = new OrderCustomer(fkOrder, fkCustomer);
orderCustomer.setCost(cost);

ArrayList<OrderCustomer> orderCustomers = new ArrayList<>();

if(result.containsKey(fkOrder)){
orderCustomers = result.get(fkOrder);
result.remove(fkOrder);
}
orderCustomers.add(orderCustomer);
result.put(fkOrder, orderCustomers);
}
db.close();
cursor.close();

return result;
}

但是由于我添加了这个函数,应用程序给了我以下无限循环:

Background sticky concurrent mark sweep GC freed 133964(3MB) AllocSpace objects, 0(0B) LOS objects, 7% free, 29MB/31MB, paused 34.098ms total 149.711ms

并且无法启动,有时会因指向该函数的 OutOfMemoryError 而崩溃。导致该错误的函数有什么问题?PS:该应用程序在第一次安装后运行良好,这可能会有所帮助。请询问您是否有更多信息。

最佳答案

您的问题是您永远不会移动超过第一行,因此光标永远不会在最后一行之后,因此无限循环。这可以通过在循环的下一次迭代之前添加 cursor.moveToNext(); 来解决。

但是,我建议使用更简单的

while(cursor.moveToNext) {
.......
}

而不是使用(见评论修复)

cursor.moveToFirst();
while (!cursor.isAfterLast()){

cursor.moveToNext(); // <<<<<<<<<< what was omitted
}
  • 如果没有提取行,则上述操作将失败,因为未检查 moveToFirst 是否成功。

因此,我建议将您的代码更改为:-

public HashMap<Integer, ArrayList<OrderCustomer>> getOrderCustomers (){
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_ORDER_CUSTOMER + " ;";
Cursor cursor = db.rawQuery(query,null);
HashMap<Integer, ArrayList<OrderCustomer>> result = new HashMap<>();

while (cursor.moveToNext()){
int fkOrder = cursor.getInt(cursor.getColumnIndex(OC_FK_ORDER));
int fkCustomer = cursor.getInt(cursor.getColumnIndex(OC_FK_CUSTOMER));
double cost = cursor.getDouble(cursor.getColumnIndex(OC_COST));

OrderCustomer orderCustomer = new OrderCustomer(fkOrder, fkCustomer);
orderCustomer.setCost(cost);

ArrayList<OrderCustomer> orderCustomers = new ArrayList<>();

if(result.containsKey(fkOrder)){
orderCustomers = result.get(fkOrder);
result.remove(fkOrder);
}
orderCustomers.add(orderCustomer);
result.put(fkOrder, orderCustomers);
}
cursor.close();
db.close();
return result;
}
  • 备注
    • getReadableDatabase 在大多数情况下会得到一个可写的数据库
    • cursor.moveToFirst() 已被删除(当光标位于第一行之前的位置(即 -1)时,moveToNext 将移动到第一行)。
    • 游标应该在数据库关闭之前关闭

关于android - 后台粘性并发标记清除GC sqlite数据库的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com