Android如何在Android中查询大型数据库(游标大小限制为1MB)

16

我正在开发一款应用程序,需要查询一个包含超过4千行、每行有90个字段(字符串)的数据库。问题是如果我使用 select * 从数据库中查询,那么我的游标会变得非常大(超过4MB),而在Android中,游标的大小限制为1MB。

我该如何解决这个问题?或者有什么优雅的方法可以解决这个问题?是否可以将数据库分成较小的块并进行查询?

3个回答

12

我找到了一种处理这个问题的方法,我想与所有需要的人分享。

   int limit = 0;
   while (limit + 100 < numberOfRows) {
       //Compose the statement
       String statement = "SELECT * FROM Table ORDER someField LIMIT '"+ limit+"', 100";
       //Execute the query
       Cursor cursor = myDataBase.rawQuery(statement, null);
       while (cursor.moveToNext()) {
           Product product = new Product();
           product.setAllValuesFromCursor(cursor);
           productsArrayList.add(product);
      }
      cursor.close();
      limit += 100;
 }

 //Compose the statement
 String statement = "SELECT * FROM Table ORDER someField LIMIT '"+  (numberOfRows - limit)+"', 100";
 //Execute the query
 Cursor cursor = myDataBase.rawQuery(statement, null);

 while (cursor.moveToNext()) {
     Product product = new Product();
     product.setAllValuesFromCursor(cursor);
     productsArrayList.add(product);
 }
 cursor.close();

主要思路是拆分数据,这样您就可以按照光标的正常用法使用它。如果您已经对表进行了索引,那么在处理5千行数据时,它可以在2秒内运行。

谢谢, Arkde


1

你需要同时获取所有这些行吗?你能分批获取它们吗?这个问题已经被问了好几次:Android SQLite and huge data sets

这里有一个建议:如果你需要修改90个字段,将它们分成10个不同的视图。在每个视图上都有一个左箭头和右箭头,这样你就可以横向遍历屏幕。因此,每个视图将显示9个字段。或者采用类似的策略。基本上,这些都是相同的视图,除了列名之外,所以你不应该修改太多的代码。


是的,我需要同时获取所有这些行,因为我需要将它们存储在一个ArrayList中,以便为ListView填充和适配。问题似乎与存储在游标中的对象的大小有关,而不是行数(在你提供的链接中回答的问题中,问题是行数的问题)。 - Aurelian Cotuna
限制适用于整体数据,无论是由于大量行或非常大的列或许多列。我不知道任何替代方案,除了以某种方式压缩您的数据。 - Sid
有什么想法可以压缩我的数据吗?我使用了String来存储它们,因为字符串大小随着其中字符的数量而增长...我不知道还有其他优化的方法。 - Aurelian Cotuna
你需要同时使用所有90个字段吗?你不能有单独的视图吗?你正在使用CursorAdapter吗? - Sid

1

通常情况下,您永远不会使用select *。首先,每行都将具有唯一标识符,并且用户只想选择特定的行和列 - 即他们可以在Android屏幕上看到的内容。毫不失礼地说,这是一个非常基本的问题。您只需返回要在手机屏幕上显示的列和行 - 否则,您将消耗不必要的电池寿命来传输永远不会显示的数据。标准方法是使用参数化存储过程。搜索参数化存储过程并进行一些阅读 - 顺便说一句 - 除非您返回该表的唯一行标识符,否则无法更新任何表。


我必须执行select*,因为不幸的是,我需要使用所有字段。用户将编辑某些字段,而其他字段将用于不同的设置。 - Aurelian Cotuna
在这种情况下,我会使用动态SQL,其中字段名称由用户从复选框列表中选择生成,以及任何需要更新的隐藏字段,然后进入详细视图。您还可以执行动态更新语句。但是,我仍然不知道如何在典型的Android显示屏上获取所有这些数据。 - Ian P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接