The Limitations of WebSQL and Offline apps
Posted on by Steve Workman About 2 min reading time
Web applications are the next big thing in the web. Being able to take web sites and make them run alongside native apps, having them work offline and perform just as well as their native counterparts is the next step along the road. As usual, with all new technology, there are some limitations.
There are three pieces of technology that are combined to make a web app: app caching, local storage and a web database technology.
App caching tells browsers what files to store offline and retrieve from disk. These are permanently stored until new instructions are received, unlike traditional caching which works until the cache is full, then starts removing files.
Limitation 1
In iOS 4.3, app caching for offline web apps is broken and does not work.
Local storage is for key/value pairs of information. It's for simple things like settings and values that need to be retrieved quickly. It's been called "cookies on crack" before, but it's really just a very fast dictionary for simple data.
Limitation 2
Depending on your browser, localStorage will keep 5-10MB of data, the equivalent of 200,000-500,000 characters. If all you want to do is store small serialised JSON objects that aren't related, use this.
Web databases are client-side data storage for larger amounts of more complex data. Whilst you can make web apps with just app caching and local storage, it's not going to be very interactive, or the data may be unstructured, or there will be lots of Ajax calls to fetch data. Web databases are where this technology gets a bit dodgy.
Originally, there was Google Gears, a plug-in which brought a SQLite database to help web apps run offline. This was then standardised into the WebSQL module and developed as a SQL database available through JavaScript. Google, Apple and Opera all implemented it and it can be found in iOS and Android devices today.
Limitation 3
Chrome has a hard 5MB database size limit - you will need to use a chrome web app to remove this limit.
Limitation 4
Chrome doesn't support OUTER JOIN or RIGHT JOIN statements.
Limitation 5
Debugging is very difficult with large amounts of data as the web inspector isn't efficient at displaying a thousand rows (and will crash with around 20,000 rows, around 2MB of data).
Limitation 6
Version numbers are not taken into account. Don't bother with them.
Limitation 7
All calls are asynchronous - if you rely on results at a certain time, be prepared to write a lot of callback functions. Your code can get messy very quickly.
Limitation 8
Performance is sluggish if you don't batch up statements into transactions.
Even better still, WebSQL is no longer in development, so these problems will remain. Microsoft and Mozilla said they didn't like it and wanted to used a different technology: IndexedDB.
IndexedDB is on it's way, but not mature enough yet to be used, nor is it implemented in any of the mobile browsers.
Advice
For offline apps, you're better sticking with WebSQL until IndexedDB matures.
Hopefully, some kind developer will come along and write a technology-agnostic wrapper, maybe that person will be you, the reader of this article. If you're thinking about it, let me know :-)