When I go training I often take notes afterwards about new techniques, or things I might improve on. It's the usual
story - pen and paper aren't always available, but my phone is. So I threw this app together. It includes a training
schedule, and also shows the club's Twitter feed.
I'm changing the app to work with any martial art, and it's an interesting exercise. The data model
below highlights the shortcomings of LINQ - unless you're using SqlMetal
you spend more time coding associations than writing the app. If you DO use SqlMetal you spend your time shoe-horning the generated code
into your project.
Damned if you do, damned if you don't, so I decided on a hybrid collection instead. It uses custom events to trigger business rules and CRUD operations, rather than INotifyPropertyChanged.
Another interesting aspect of the project was designing the club locator. If the app is going
to be useful world wide, then users should select clubs by country, then region and finally a town
or city within the chosen region. That scenario is simplified, but does highlight the need for a
list of cities.
I got the data from GeoNames.org. The first
challenge was to load the GeoNames table from AllCountries.zip
into SQL Server. That meant converting from UTF-8 to UTF-16. Next step was to extract all cities (entries with a
PPL* feature code) with my minimum population threshold into a separate table, and create references to the appropriate
region and region to country. The final step was to serialise the data into a custom binary format (TLV) to shrink
the size of the data that goes over the wire from the server to the phone.
A good example of how a one-week hack runs into a 6 week project that's still not in the app store.