Inserts, updates, deletes and reads are generally OK from multiple threads, but Brad's answer is not correct. You have to be careful with how you create your connections and use them. There are situations where your update calls will fail, even if your database doesn't get corrupted.
The basic answer.
The SqliteOpenHelper object holds on to one database connection. It appears to offer you a read and write connection, but it really doesn't. Call the read-only, and you'll get the write database connection regardless.
So, one helper instance, one db connection. Even if you use it from multiple threads, one connection at a time. The SqliteDatabase object uses java locks to keep access serialized. So, if 100 threads have one db instance, calls to the actual on-disk database are serialized.
So, one helper, one db connection, which is serialized in java code. One thread, 1000 threads, if you use one helper instance shared between them, all of your db access code is serial. And life is good (ish).
If you try to write to the database from actual distinct connections at the same time, one will fail. It will not wait till the first is done and then write. It will simply not write your change. Worse, if you don’t call the right version of insert/update on the SQLiteDatabase, you won’t get an exception. You’ll just get a message in your LogCat, and that will be it.
So, multiple threads? Use one helper. Period. If you KNOW only one thread will be writing, you MAY be able to use multiple connections, and your reads will be faster, but buyer beware. I haven't tested that much.
Here's a blog post with far more detail and an example app.
Gray and I are actually wrapping up an ORM tool, based off of his Ormlite, that works natively with Android database implementations, and follows the safe creation/calling structure I describe in the blog post. That should be out very soon. Take a look.
In the meantime, there is a follow up blog post:
Also checkout the fork by 2point0 of the previously mentioned locking example:
Best Answer
It was difficult to find, so i'm going to add it as an answer here on Stackoverflow. I knew the answer from spelunking the registry, but i wanted the supported method.
From Registry Entries for ODBC Components archive, we learn ODBC drivers are registered in the registry.
will contain a value for each driver equal to
"Installed"
:So you would need to create something like:
For each driver, there will then exist an
In this folder is a series of Driver specifications:
Microsoft documents these items quite nicely in the Driver Specification Subkeys archive page on MSDN.
In the case of an SqlLite ODBC driver that would mean there is a key called:
and you would have to be sure to create all the values for the SqlLite ODBC driver.
But don't do that
Another item in the driver details is a reference count (called
UsageCount
). This Usage Count is not meant to be fiddled with by people; but instead is updated when you call the functions:So while you can push stuff into the registry yourself, you should be calling the documented API SQLInstallDriver.
And while it's probably safe to read the registry to see what drivers are installed, the documented say to get the list of drivers is: