Convert a Content Provider Cursor to JSON
This is a short article where we will read the data from the content provider and convert it to JSON. So, Let's query the SMS table and get a reference to the cursor.
// Query the sms table val cursor = context?.contentResolver?.query( Telephony.Sms.Inbox.CONTENT_URI, null, null, null, null )
With the cursor in hand, loop through it to read the rows and columns.
cursor?.use {
// Total number of columns in the table
Log.v(TAG, "Column Count: ${it.columnCount}")
// Total number of rows in the table
Log.v(TAG, "Row Count: ${it.count}")
// Move to the first item
it.moveToFirst()
// Temporary json variable that contains all the rows and their values
val rowJson = JSONArray()
// Loop through the rows
do {
// Temporary json variable that contains all the columns and their vales
val columnJson = JSONObject()
// Loop through the columns
it.columnNames.forEachIndexed { i, columnName ->
// Add the column name and its value to the column array
columnJson.put(columnName, it.getString(i))
}
Log.v(TAG, "Json Row: $columnJson")
// Add the column data to the corresponding row
rowJson.put(columnJson)
} while (it.moveToNext())
// Return the json string
rowJson.toString()
}.apply {
// Print the entire sms data to the Logcat
Log.v(TAG, this)
}
Below is a sample row of the SMS table in the JSON format. The columns will differ for different devices and the OS versions.
{ "_id":"792", "thread_id":"286", "address":"IX-OLACBS", "person":"0", "date":"1545299882278", "date_sent":"1545299882000", "protocol":"0", "read":"0", "status":"-1", "type":"1", "reply_path_present":"0", "body":"Hi Srikar Reddy, not only rides, now order food also on Ola! Fire up the app and get delicious food delivered straight to your desk. https:\/\/bit.ly\/2QaptoK", "service_center":"+919844047238", "locked":"0", "sub_id":"0", "network_type":"13", "error_code":"0", "creator":"com.android.mms", "seen":"1", "mtype":"0", "privacy_mode":"0", "group_id":"2592", "addr_body":"0,", "time_body":"0,", "risk_url_body":"", "is_secret":"0" }