我正在开发一款应用程序,需要查询一个包含超过4千行、每行有90个字段(字符串)的数据库。问题是如果我使用 select *
从数据库中查询,那么我的游标会变得非常大(超过4MB),而在Android中,游标的大小限制为1MB。
我该如何解决这个问题?或者有什么优雅的方法可以解决这个问题?是否可以将数据库分成较小的块并进行查询?
我正在开发一款应用程序,需要查询一个包含超过4千行、每行有90个字段(字符串)的数据库。问题是如果我使用 select *
从数据库中查询,那么我的游标会变得非常大(超过4MB),而在Android中,游标的大小限制为1MB。
我该如何解决这个问题?或者有什么优雅的方法可以解决这个问题?是否可以将数据库分成较小的块并进行查询?
我找到了一种处理这个问题的方法,我想与所有需要的人分享。
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
你需要同时获取所有这些行吗?你能分批获取它们吗?这个问题已经被问了好几次:Android SQLite and huge data sets
这里有一个建议:如果你需要修改90个字段,将它们分成10个不同的视图。在每个视图上都有一个左箭头和右箭头,这样你就可以横向遍历屏幕。因此,每个视图将显示9个字段。或者采用类似的策略。基本上,这些都是相同的视图,除了列名之外,所以你不应该修改太多的代码。
通常情况下,您永远不会使用select *。首先,每行都将具有唯一标识符,并且用户只想选择特定的行和列 - 即他们可以在Android屏幕上看到的内容。毫不失礼地说,这是一个非常基本的问题。您只需返回要在手机屏幕上显示的列和行 - 否则,您将消耗不必要的电池寿命来传输永远不会显示的数据。标准方法是使用参数化存储过程。搜索参数化存储过程并进行一些阅读 - 顺便说一句 - 除非您返回该表的唯一行标识符,否则无法更新任何表。