Implementing Own ContentProvider

0
1591

Hello !! Friends in this tutorial we are going to insert data and retrieve the data using our Own ContentProvider.

  • Steps are as Follows :

  1. Create a new project and name it as “MyContentProvider”.
  2. Now your MainActivity.Java and activity_main.xml will be generated.
  3. Go to your activity_main.xml file and design the graphical layout for your display.
  4. Take two TextView and set its text as NAME and GRADE .
  5. Also take two EditText and place them below NAME and GRADE respectively.
  6. Also take two buttons and name it as Add Name and Retrive Students .
  7. The code for the activity_main.xml file is given below :
  8. [code language=”xml”]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Name" />
    <EditText
    android:id="@+id/txtName"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Grade" />
    <EditText
    android:id="@+id/txtGrade"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
    <Button
    android:text="Add Name"
    android:id="@+id/btnAdd"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onClickAddName" />
    <Button
    android:text="Retrieve Students"
    android:id="@+id/btnRetrieve"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onClickRetrieveStudents" />
    </LinearLayout>
    [/code]

  9. The Layout will look as shown :
  10. 0

  11. Thus the window will look like as shown below :
  12. 1

  13. Now go to your MainActivity.Java file and write the Code for Add and Retrive button as shown below :
  14. [code language=”java”]public void onClickAddName(View view)
    {

    // Add a new student record
    ContentValues values = new ContentValues();

    //Add the NAME in the database:
    values.put(StudentsProvider.NAME,
    ((EditText)findViewById(R.id.txtName)).getText().toString());

    //Add the GRADE in the database:
    values.put(StudentsProvider.GRADE,
    ((EditText)findViewById(R.id.txtGrade)).getText().toString());

    //Insert the values in StudentsProvider :
    Uri uri = getContentResolver().insert(
    StudentsProvider.CONTENT_URI, values);

    //Set the Toast message:

    Toast.makeText(getBaseContext(),uri.toString(), Toast.LENGTH_LONG).show();
    }

    public void onClickRetrieveStudents(View view)
    {
    // Retrieve student records
    String URL = "content://com.example.provider.College/students";
    Uri students = Uri.parse(URL);
    Cursor c = managedQuery(students, null, null, null, "name");

    if (c.moveToFirst())
    {
    do
    {
    //Display the Id,Name,Grade on clicking the retrieve button :
    Toast.makeText(this,
    c.getString(c.getColumnIndex(StudentsProvider._ID)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)),
    Toast.LENGTH_SHORT).show();
    } while (c.moveToNext());

    }
    }

    [/code]

  15. Your MainActivity.Java file will look as shown below :
  16. 2
    3.1

  17. Now create another class named StudentsProvider.Java and write the following code :
  18. [code language=”java”]public class StudentsProvider extends ContentProvider {

    static final String PROVIDER_NAME = "com.example.provider.College";
    static final String URL = "content://" + PROVIDER_NAME + "/students";
    static final Uri CONTENT_URI = Uri.parse(URL);

    static final String _ID = "_id";
    static final String NAME = "name";
    static final String GRADE = "grade";

    private static HashMap<String, String> STUDENTS_PROJECTION_MAP;

    static final int STUDENTS = 1;
    static final int STUDENT_ID = 2;

    static final UriMatcher uriMatcher;
    static
    {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS);
    uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID);
    }
    /**
    * Database specific constant declarations
    */
    private SQLiteDatabase db;
    static final String DATABASE_NAME = "College";
    static final String STUDENTS_TABLE_NAME = "students";
    static final int DATABASE_VERSION = 1;
    static final String CREATE_DB_TABLE =
    " CREATE TABLE " + STUDENTS_TABLE_NAME +
    " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
    " name TEXT NOT NULL, " +
    " grade TEXT NOT NULL);";

    /**
    * Helper class that actually creates and manages
    * the provider’s underlying data repository.
    */
    private static class DatabaseHelper extends SQLiteOpenHelper
    {
    DatabaseHelper(Context context)
    {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
    db.execSQL(CREATE_DB_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,
    int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME);
    onCreate(db);
    }
    }

    @Override
    public boolean onCreate()
    {
    Context context = getContext();
    DatabaseHelper dbHelper = new DatabaseHelper(context);
    /**
    * Create a write able database which will trigger its
    * creation if it doesn’t already exist.
    */
    db = dbHelper.getWritableDatabase();
    return (db == null)? false:true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
    String[] selectionArgs, String sortOrder) {

    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    qb.setTables(STUDENTS_TABLE_NAME);

    switch (uriMatcher.match(uri))
    {
    case STUDENTS:
    qb.setProjectionMap(STUDENTS_PROJECTION_MAP);
    break;
    case STUDENT_ID:
    qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1));
    break;
    default:
    throw new IllegalArgumentException("Unknown URI " + uri);
    }

    if (sortOrder == null || sortOrder == "")
    {
    /**
    * By default sort on student names
    */
    sortOrder = NAME;
    }
    Cursor c = qb.query(db , projection, selection, selectionArgs,
    null, null, sortOrder);
    /**
    * register to watch a content URI for changes
    */
    c.setNotificationUri(getContext().getContentResolver(), uri);

    return c;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs)
    {
    int count = 0;
    switch (uriMatcher.match(uri))
    {
    case STUDENTS:
    count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs);
    break;
    case STUDENT_ID:
    String id = uri.getPathSegments().get(1);
    count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id +
    (!TextUtils.isEmpty(selection) ? " AND (" +
    selection + ‘)’ : ""), selectionArgs);
    break;
    default:
    throw new IllegalArgumentException("Unknown URI " + uri);
    }

    getContext().getContentResolver().notifyChange(uri, null);
    return count;
    }

    @Override
    public String getType(Uri uri) {
    switch (uriMatcher.match(uri)){
    /**
    * Get all student records
    */
    case STUDENTS:
    return "vnd.android.cursor.dir/vnd.example.students";
    /**
    * Get a particular student
    */
    case STUDENT_ID:
    return "vnd.android.cursor.item/vnd.example.students";
    default:
    throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub
    /*Add a new student record*/
    long rowID = db.insert( STUDENTS_TABLE_NAME, "", values);
    /* If record is added successfully */
    if (rowID > 0)
    {
    Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
    getContext().getContentResolver().notifyChange(_uri, null);
    return _uri;
    }
    throw new SQLException("Failed to add a record into " + uri);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    // TODO Auto-generated method stub

    int count = 0;
    switch (uriMatcher.match(uri))
    {
    case STUDENTS:
    count = db.update(STUDENTS_TABLE_NAME, values,
    selection, selectionArgs);
    break;
    case STUDENT_ID:
    count = db.update(STUDENTS_TABLE_NAME, values, _ID +
    " = " + uri.getPathSegments().get(1) +
    (!TextUtils.isEmpty(selection) ? " AND (" +
    selection + ‘)’ : ""), selectionArgs);
    break;
    default:
    throw new IllegalArgumentException("Unknown URI " + uri );
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return count;

    }

    }

    [/code]

  19. So your coded window will look like as shown below :
  20. 4
    5
    6
    7
    8
    9

  21. Now go to your AndroidManifest.xml file and write the following code inside the application :
  22. [code language=”xml”]
    <provider android:name="StudentsProvider"
    android:authorities="com.example.provider.College">
    </provider>
    [/code]

    //StudentsProvider is the name of the class and com.example.provider.College is the PROVIDER_NAME given in the StudentsProvider.Java class.

  23. Your AndroidManifest.xml file will look as shown below :
  24. 10

  25. Now run your application and you will have the following Output :
  26. 11

  27. Now enter the name and grade and click on the add button and Your record will be added .
  28. 12

  29. Now when you will click on Retrive Students button you will get an toast message displaying the inserted student’s name grade and Id’s.
  30. 13

  31. Thus we have implemented our own ContentProvider .