For my app I have a simple API to push/pull JSON data from server.
Suppose I fetched a list as a JSON array
I saved that JSON array into file "my_list.json" with MODE_PRIVATE access. I am saving the list to show when app is just started without network connection.
Also I am showing the list data (JSON array converted into Object array) in a List View.
In this listview User can select an item and delete that particular item (deleting through API calls, so in server DB that item is deleted) and that is disappeared from list.
Since I didn't delete that item in saved file "my_list.json" deleted data is appearing again when app is started.
I know maintaining a sqlite DB in my app solves this problem. But without using DB -
Is it good practice to save list data as JSON into file in android app ?
What is the elegant solution for such cases without using database in my app?
To be able to alter the data the way you want the best way is to use SQLite database, which will allow you to query, update and delete the records you save .. which is a way better solution than using shared preferences or files.
Here's an excellect tutorial of how to implement it
Related
in my Android app, I have a List of objects (Employees) obtained from a JSON on a server. Whenever I open the app, it parses the JSON, creates the ArrayList and populates RecyclerView. I would like to create a database and load the data from the database instead of JSON (so that it works offline as well and is faster).
My question is: how do I keep the database updated to make sure I have the same data in JSON and database?
What is the best approach to do this? I notice when I open the gmail app for example, it loads my emails even when I am offline, so it must be using a database as well.
EDIT: Solved it with using DBFlow and just calling save() on the whole list, which automatically decides whether to update a row or insert new one.
Scenario "DB is empty": Show empty view message and fetch data from API endpoint -> save that to database and afterwards populate RecyclerView from database.
Scenario "DB not empty": Populate from database -> try to fetch new data, if there is no connection it still shows old data otherwise do steps from first scenario.
Additionally you could compare the custom class that populates the RecyclerView to prevent glitches while reloading same data.
I am developing a places of interest app which will display the list of places of interest in a location.
When user chooses one, it will display more information and address etc.
How do I store all this data? Currently I am using a text file to store all the data and subsequently when user chooses a place, it will parse the text file and retrieve the necessary data for display.
Any advice on what is a better way to do this? I looked at SharedPrefs, but it is more like storing "key-value" pair and in this case I need to store a large amount of data.
I want the info to be available even when the device is offline, thus I can't download from an online server upon request.
Any other way to do this?
You may store it to XML file using XML serializer, here is very good tutorial for learning that,
http://www.ibm.com/developerworks/library/x-android/
and it can be easily parsed using Java XPath Api. Have a look at this at parsing XML files
http://www.ibm.com/developerworks/library/x-javaxpathapi/
Use SQLite
It can store large data.
It is available offline.
All your problems will be sorted out.
Hre we have a wonderful tutorial for sq-lite
http://www.vogella.com/articles/AndroidSQLite/article.html
How about a relational database?
http://developer.android.com/training/basics/data-storage/databases.html
Take a look at Serialization. If you do not need database access, you could define a class what holds every information you need. Then, you can do the following:
when you need to save the datas, you serialize your object, dumping its content to a file, for example on the SD card
when you want to load the datas, you just load the above mentioned file, and get back everything from the dumped file
I am using this method in my app to cache some datas that would need internet access, so the user can still view it, and with proper implementation, this can work very nicely.
Use database, create table and insert all the data in it. When you need the data just fire the query, and you are done.
SQLite is fine for Android.
Depending on the type of data you want to store, you could use a SQLite Database (provided with Android) if it has a normal database structure. You could Serialize your data and save it in a raw or encrypted file, making you data implement Serializable.
With your help, I have successfully created a web page which has its own MySQL DB and then uses a JSON web service to pass the values my Android application.
The next stage is to copy them into a local SQLite DB so the phone does not require an internet connection to view the list.
I have successfully implemented code that creates a table, and inserts values into this table.
The problem is, I don't want it to necessarily re-write the whole DB at a time, which is the current idea to keep it current.
I might have things in the DB deleted or more things added, and want the local DB to reflect this.
What steps can I take to delete things that are no longer present in the MySQL DB in the SQLite one, and add new things?
Cheers
The best way to do this should be to have a date time column in your database and then just fetch the posts that are newer then the last time you fetched from the database, in your android app you could save an date time in your preferences
I'm sorry I missed that you wanted to delete items as well, than this probably isn't the best approach. Are you using the mySQL only for the API? Then you could probably mark posts as deleted inserted odd feeling them.
You can think this approach, parse your JSON response into objects of your data model and then create the content values holding that data model to work with the database in your device.
Once you have the content values, use a content resolver to work with your database and try an update of each data parsed from the JSON response (each content value), update method of the content resolver will return an integer value that tell us the number of rows updated in the database, if such number is 0 means that no data were in the database, so make an insertion, simply.
In that way you first search if the current data is present in the database, if it is, update it, if not, insert it.
I am going to populate data from server to a listview (endless). What is the best practice for doing this? Should I cache this data to local db?
Update: Usually list contains not much data about each item. But those item types (say it a "company info") I am also going to use for favorites which should always be stored locally. So I would like to reuse the same table for favorites and items temporally downloaded from server.
Firstly as per per your question please be specific about your requirement .
To handle data from server to listview .. The data that is obtained from server ( i.e parsed json , xml etc) need to sotred in some collection say ArrayList or Hash map etc.
These list can be populated from the above collections.
But if you intend to have permanent storage for the data in the app i.e offline browsing etc than you should save the data in sqlite db and use Cursor Adpater etc for showing the list.
So, the way you use the android recommended widgets and views depends upon the your requirement in mind + the optimized way to handle those things in efficient way.
I have an Android application which talks to a public Data-API by calling URLs. The API returns XML which describes search results or detailed Data of a particular dataset.
In my Application i retrieve this data and parse it to Java Objects to display them in a ListView for example.
edit: Just to make it clearer: In my Application you can search for music Artists and get their whole discographic information. I Retrieve the list of Releases and display them in a ListView. (No problem right here, because the results of the same search request can change any minute i have to retrieve this data everytime a search request is issued).
Now i have a list with all the LPs the Beatles produced (for example). I can then click one particular LP and view the Details such as the Release Year and the Tracklist.
What i want to cache is the Details data and i'm currently thinking of which is the best way to do this. I thought of:
Retrieving the XML data once and store the XML Data in the SQLite Database (that would imply, that i have to parse the data everytime i want to access it again).
Retrieving the XML data once, parsing it once and somehow store the serialized JavaObject into the SQLite Database as ByteStream. (so all the time consuming work would be done just once).
What do you think is the best version or is there maybe another better way to achieve caching the results?
serializing an object would be quick solution but that could not be effective solution. Every a time you need to load entire object, while in this case if you are storing your data set into database then, using cursor/queries data handling will be smoother.
CursorAdapter will allow you to plug database cursor directly to list in GUI. I would suggest you to use database approach.