应该显示相当长的产品代码列表的ListView
内容(比如多达 10 万个,即不小)。因此,有效的交互式搜索很重要。由于这里没有解释的原因,过滤器值应该是URI的一部分......
我正在使用 SQLite 表和LoadManager
andCursorLoader
方法。每当过滤器字符串发生变化时,游标加载器就会被重置,并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
在哪里,数字和是路径前一部分表示的表的 id...apple
123
456
从另一个角度来看——对于前面的例子——客户 ID、订单 ID 和过滤器值可以用作键值对,分别是'custome'
、'order'
和'filter'
。此外,我不知道将来会添加什么。
我想从正确的应用程序 URI 系统开始。我想它必须由其他人完成很多次。你能分享你的经验吗?我想避免以后重新设计它的必要性。