Android. Content provider or Database?
Asked Answered
B

3

30

I'm a bit confused in the question, if it's better to use ContentProvider or Database. Or it makes no difference if I don't want to share any data with other applications.

If I've understood it right, content providers based on SQLite DBs and it's also possible that content of them is only accessable for my application.

Can you give some explanations?

Thank you very much,

Mur

Burhans answered 22/11, 2010 at 8:45 Comment(2)
possible duplicate of how to decide between direct database access and content provider?Marinate
possible duplicate of When to use a Content ProviderFoam
B
50

There certainly are worthwhile problems for which a provider is a solution, particularly for cross-app data publishing. For example, you need to use a content provider to supply search suggestions to a Quick Search Box.

However, for internal use within an application, I am not a fan. The benefits IMHO are outweighed by the costs (e.g., reduced flexibility, additional overhead).

If you do implement a content provider, bear in mind that they are accessible by other applications by default. You need to include android:exported="false" in the <provider> element to make them private to your app.

Breakthrough answered 22/11, 2010 at 13:5 Comment(7)
Over one year on, still question marks in your thought bubble over this?Stagecraft
@JohnnyLambada: Yes. I am somewhat more neutral on the point than I was when I wrote this answer, but I still wouldn't use a content provider for internal use within an app.Breakthrough
@CommonsWare:Content provider is easy to access.....What should i prefer for internal use within an applicationRequirement
@CommonsWare, if the light bulb appears in your head regarding content providers ans SQLite, please write a blog post! Thank youChuckwalla
@ShahzadImam just the Database HelperThereby
I wrote my own library (trantil) to avoid SQLite boiler plate code and include some of the content provider functionality.Calcium
@Breakthrough I'm experienced myself what you mentioned. ContentProviders do give us very nice functionalities, but we lose the flexibility we have when working directly with a SQLite database. Now I have problem because I can't use the ContentProvider's insert method to insert data for two tables. I really appreciate if you could have a look at this question: goo.gl/mdBsGF Maybe you have any idea that could help me.Madancy
F
12

Using a content provider will give you a more modular design, and make your life easier if you at some point in future would like to reach the data from other applications. If you are certain that the data will only ever be needed from one application, you might as well operate directly on the database.

There is one particular SQLite limitation you should be aware of and that is that SQLite is single-user only. What this really means is that you will need to guard your database from being accessed from multiple threads at the same time. This is generally not a problem in a content provider, since they almost always have a single-threaded implementation.

Farthingale answered 22/11, 2010 at 9:42 Comment(2)
So if I don't think, that data from my application should be shared with other applications, it's better to use SQLite?! I've read also this topic #1379700 That means, there are some problems with using of contentproviders. Hmmm ...Burhans
Well, SQLite will be used in both cases, and the problems brought up in the thread you refer to are very similar. With a content provider, you are sort of forced to a single user scenario, but if you make it a habit of only doing database access from one dedicated worker thread, it is fairly easy to stay clear of that problem. However, the most obvious benefit (and the only one I think is worth the effort) is when the database and the application using it live in separate processes.Farthingale
S
0

Reasons to use content provider are here.

In summary:

  1. Easily change the underlying data source (you can change your db from Sqlite to Mongo or to a JSON file without any app changes)
  2. Leverage functionality of some Android Classes (SyncAdapter, Loaders, CursorAdapter) - These classes require content provider and you cant use them if you dont have one
  3. Allow many apps to access, use and modify a single data securely. (which is really the main reason for using it)
Schiffman answered 3/12, 2016 at 15:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.