Not sure if this is the right place (I am sure someone will let me
know if it is not)  I have a iPhone application that has a UITable
view that is backed by core data.  I want to perform a reducing search
so that only the items starting with the characters entered into the
search bar are shown.  This is normally done with delegate - (void)
searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)
searchText no problem.  I am a little confused as I am new to Core
Data how to do this.  One of the big problems as I see it is going to
be updating the interface to let it know what to present.  I assume an
alternative NSFetchedResultsController needs to be sent to the
UITableView.

You're basically on the right track.

So here are my issues:
1) I assume I need to create a  NSFetchedResultsController with only
the correct items in it then tell the UITableView to use this as the
dataSource and reload the table?

Yes. Most of the Apple apps use an overlay, so it's also a different UITableView entirely. See search in the Contacts app, for example.

2) is there a better way than executing a full sorted fetch and
removing those objects that do not conform.  ie is there a way of
doing a select where type fetch?

I'm not sure exactly what you mean by "select where type" fetch. What type ?

The typical pattern is if the user typing has gone from a 0 length string to a 1 character string, you'll need to do a fetch. (that includes the user deleting a character and starting over). If the string already has 1 or more characters, you can choose between a new fetch, or simply an in memory filter of the previous results. The results should always be sorted, so you can binary search the range to filter, instead of filtering all the strings.

The balance of when to fetch and when to filter is complicated, and depends on your data set, as well as your UI. If you have an extremely large data set, you should use a fetch limit, so that the user cannot get back all the results until they've entered a sufficiently discriminating search string. If the number of results you get back is equal to the fetch limit, you can consider executing a count request or just saying "and more...".

If the number of results is small, then it's much faster to filter the old results in memory. Fetching will save you a lot of memory, but it is I/O so it has a high fixed cost (like ~2ms on a desktop). You'll want to balance the two. You might start out with a threshold of 100 and tune from there.

Thanks in advance and sorry if this is a dumb question.

It's not.

- Ben

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to