Read Database backed content provider and fill ListView
Description
The following code shows how to Read Database backed content provider and fill ListView.
Example
Register provider in manifest file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.java2s.myapplication3.app" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="java2s.com"
android:theme="@style/AppTheme" >
<activity
android:name="com.java2s.myapplication3.app.MainActivity"
android:label="java2s.com"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name=".MyProvider"
android:authorities="com.examples.sharedb.friendprovider">
</provider>
</application>
</manifest>
Layout xml file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
Main activity Java file
package com.java2s.myapplication3.app;
//from w w w. ja va 2 s. c o m
import android.app.Activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class MainActivity extends Activity implements
LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
private static final int LOADER_LIST = 100;
SimpleCursorAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// getSupportLoaderManager().initLoader(LOADER_LIST, null, this);
mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null,
new String[]{MyProvider.Columns.FIRST},
new int[]{android.R.id.text1}, 0);
ListView list = new ListView(this);
list.setOnItemClickListener(this);
list.setAdapter(mAdapter);
setContentView(list);
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Cursor c = mAdapter.getCursor();
c.moveToPosition(position);
Uri uri = Uri.withAppendedPath(MyProvider.CONTENT_URI, c.getString(0));
String[] projection = new String[]{MyProvider.Columns.FIRST,
MyProvider.Columns.LAST,
MyProvider.Columns.PHONE};
//Get the full record
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
String message = String.format("%s %s, %s", cursor.getString(0), cursor.getString(1), cursor.getString(2));
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
cursor.close();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = new String[]{MyProvider.Columns._ID,
MyProvider.Columns.FIRST};
return new CursorLoader(this, MyProvider.CONTENT_URI,
projection, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
Content provider file
package com.java2s.myapplication3.app;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
//from w w w . j a va 2s . co m
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyProvider extends ContentProvider {
public static final Uri CONTENT_URI = Uri.parse("content://com.examples.sharedb.friendprovider/friends");
public static final class Columns {
public static final String _ID = "_id";
public static final String FIRST = "firstName";
public static final String LAST = "lastName";
public static final String PHONE = "phoneNumber";
}
/* Uri Matching */
private static final int FRIEND = 1;
private static final int FRIEND_ID = 2;
private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
matcher.addURI(CONTENT_URI.getAuthority(), "friends", FRIEND);
matcher.addURI(CONTENT_URI.getAuthority(), "friends/#", FRIEND_ID);
}
SQLiteDatabase db;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int result = matcher.match(uri);
switch(result) {
case FRIEND:
return db.delete(ShareDbHelper.TABLE_NAME, selection, selectionArgs);
case FRIEND_ID:
return db.delete(ShareDbHelper.TABLE_NAME, "_ID = ?", new String[]{uri.getLastPathSegment()});
default:
return 0;
}
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long id = db.insert(ShareDbHelper.TABLE_NAME, null, values);
if(id >= 0) {
return Uri.withAppendedPath(uri, String.valueOf(id));
} else {
return null;
}
}
@Override
public boolean onCreate() {
ShareDbHelper helper = new ShareDbHelper(getContext());
db = helper.getWritableDatabase();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
int result = matcher.match(uri);
switch(result) {
case FRIEND:
return db.query(ShareDbHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
case FRIEND_ID:
return db.query(ShareDbHelper.TABLE_NAME, projection, "_ID = ?", new String[]{uri.getLastPathSegment()}, null, null, sortOrder);
default:
return null;
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int result = matcher.match(uri);
switch(result) {
case FRIEND:
return db.update(ShareDbHelper.TABLE_NAME, values, selection, selectionArgs);
case FRIEND_ID:
return db.update(ShareDbHelper.TABLE_NAME, values, "_ID = ?", new String[]{uri.getLastPathSegment()});
default:
return 0;
}
}
}
class ShareDbHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "frienddb";
private static final int DB_VERSION = 1;
public static final String TABLE_NAME = "friends";
public static final String COL_FIRST = "firstName";
public static final String COL_LAST = "lastName";
public static final String COL_PHONE = "phoneNumber";
private static final String STRING_CREATE =
"CREATE TABLE "+TABLE_NAME+" (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+COL_FIRST+" TEXT, "+COL_LAST+" TEXT, "+COL_PHONE+" TEXT);";
public ShareDbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(STRING_CREATE);
ContentValues cv = new ContentValues(3);
cv.put(COL_FIRST, "John");
cv.put(COL_LAST, "Doe");
cv.put(COL_PHONE, "8885551234");
db.insert(TABLE_NAME, null, cv);
cv = new ContentValues(3);
cv.put(COL_FIRST, "Jane");
cv.put(COL_LAST, "Doe");
cv.put(COL_PHONE, "8885552345");
db.insert(TABLE_NAME, null, cv);
cv = new ContentValues(3);
cv.put(COL_FIRST, "Jill");
cv.put(COL_LAST, "Doe");
cv.put(COL_PHONE, "8885553456");
db.insert(TABLE_NAME, null, cv);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}
}