如何设计URI系统?

时间:2013-08-08 08:55:24

标签: android android-listview

ListView应该显示相当长的产品代码列表的内容(比如高达100万,即不小)。因此,有效和互动的搜索很重要。由于此处未解释的原因,过滤器值应该是URI ...

的一部分

我正在使用SQLite表,以及LoadManagerCursorLoader方法。只要过滤器字符串发生更改,就会重置游标加载器,并依次调用onCursorLoader。我正在使用这样的代码:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    // Compose the URI based on whether the content should be filtered or not.
    // mCurFilter contains the filter value.
    Uri uri;
    if (mCurFilter.isEmpty()) {
        uri = DemoContentProvider.PRODUCTS_CONTENT_URI;
    } else {
        uri = Uri.withAppendedPath(DemoContentProvider.PRODUCTS_CONTENT_FILTER_URI,
                                   Uri.encode(mCurFilter));
    }

    String[] projection = { ProductTable.COLUMN_ID,
                            ProductTable.COLUMN_CODE,
                            ProductTable.COLUMN_NAME,
                            ProductTable.COLUMN_STOCK,
                            ProductTable.COLUMN_PRICE };

    CursorLoader cursorLoader = new CursorLoader(this,
            uri, projection,
            null, null,     // no selection and selargs - filter value inside the URI
            orderInfo);     // info for sorting

    return cursorLoader;
}

请关注uri构图。这里PRODUCTS_CONTENT_FILTER_URI被定义为:

public static final Uri PRODUCTS_CONTENT_FILTER_URI =
        Uri.parse("content://" + AUTHORITY
                   + "/" + ProductTable.CONTENT_PATH + "/filter");

示例可能看起来像

content://cz.xxx.android.yyydemo.contentprovider/product/filter/abc

其中abc是用户输入的过滤值。我觉得这个URI设计可能不正确(作为该领域的初学者)。对我来说,以下示例都可以:

content://AUTHORITY/product/     ... to get all products
content://AUTHORITY/product/123  ... to get the product with _id = 123

然而,像filter/value这样的后缀是不是很好的方法?

更新:我最终会有几个相互关联的活动。请考虑客户产品订单头订单列表备注列表。我是新的类似网络的数据处理系统(即如何设计URI系统)。我想为我的URI设计规则,以便它可以是一种通用的。我知道他们只是字符串,我可以做到这一点。但我想这样做很好 :)

例如:如果客户列表变大,用户可能希望过滤该列表。我可能想表示过滤作为URI的一部分。已经的产品列表很大。我想对产品使用相同的URI结构。现在,订单将客户和产品放在一起。

说,我想显示客户和订单(订单头)的产品清单,其中包含有关订购数量的产品的信息,包括零数量的产品(可以将它们添加到命令)。这样,产品与数量的组合列表是一种类似于普通产品列表(至少列表中相同数量的项目) - 用户可能想要过滤,更改订购等。但是, URI应包含客户ID和订单ID。添加过滤后,还应将其添加到URI中。我知道我可以简单地使用类似/customer/123/order/456/filter/apple的路径,其中apple是过滤器值,数字123456是前一部分表示的表的ID路径...

从另一个角度来看 - 对于上一个示例 - 客户ID,订单ID和过滤器值可以用作'custome''order'的键的键值对,和'filter'分别。而且,我不知道将来会添加什么。

我想首先正确启动应用程序URI的系统。我想其他人必须做很多次。你能分享一下你的经历吗?我想避免以后重新设计它的必要性。

1 个答案:

答案 0 :(得分:0)

  1. 如何构建它是一个方便的问题。我添加“过滤器”URI以降低查询的复杂性(例如多个“WHERE”条件,“JOIN”s)

  2. ListView正在重用子视图,因此它可以处理很多。适配器过滤器旨在减少适配器中已有的内容。当我们谈论大数据时,我宁愿不首先加载它。