优化Android中现有搜索查询的结果

时间:2011-09-29 15:31:05

标签: android search cursor android-contentprovider

在我的Android应用中,我想对内容提供商执行查询,然后优化搜索(我有两个WHERE子句字符串)。第二个查询应返回的记录是第一个查询返回的行的子集。

我目前的解决方案是这样的:

Cursor cursor1 = query (myUri, myProjection, where1, null, null);  
//do stuff  
Cursor cursor2 = query (myUri, myProjection, where2, null, null);  
//do other stuff  

如果我这样做,第二次查询运行根本不是很有效(它搜索完整数据库,就像第一次一样)。我想第二个查询只针对cursor1中返回的行运行。可以这样做,怎么做?

android文档指出,如果我使用相同(参数化)的字符串,使用不同的参数,可以缓存查询。这有用吗,还是有完全不同的方法呢?

1 个答案:

答案 0 :(得分:1)

检查CursorAdapter。它实现了Filterable接口,并包含一些有趣的方法:setFilterQueryProvider和getFilterQueryProvider。我没有使用CursorAdapter,但如果它与其他适配器(或实现Filterable的自定义适配器)类似,那么它正是您所需要的。

更新以下是一个示例:http://www.outofwhatbox.com/blog/2010/11/android-simpler-autocompletetextview-with-simplecursoradapter/

您感兴趣的部分是:

adapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            // Search for states whose names begin with the specified letters.
            Cursor cursor = mDbHelper.getMatchingStates(
                    (constraint != null ? constraint.toString() : null));
            return cursor;
        }
    });

当它返回新的Cursor实例时,我认为它确实再次命中了DB。您可以通过迭代游标并查找匹配来实现自己的搜索逻辑。您将不得不编写一些基准测试,以确定是否值得避免使用新的Query来访问数据库,因为手动迭代Cursor会更难以使用数据库。请记住,除非您明确要求(通过调用Cursor上的任何readXXX()),否则实际上不会从DB检索数据(行/记录)。

你可能对ORMLite

感兴趣吗?