zoukankan      html  css  js  c++  java
  • android 玩转ContentProvider之二--实现多个ContentProvider对多张表进行操作

    SQLite数据库直接操作类:

    DatabaseHelper.java

    [java] view plaincopy
     
     
    1. package com.jacp.database;  
    2.   
    3. import android.content.Context;  
    4. import android.database.sqlite.SQLiteDatabase;  
    5. import android.database.sqlite.SQLiteOpenHelper;  
    6.   
    7. import com.jacp.demo.provider.Provider;  
    8.   
    9. public class DatabaseHelper extends SQLiteOpenHelper {  
    10.     private static final String DATABASE_NAME = "jacp_demo.db";  
    11.     private static final int DATABASE_VERSION = 1;  
    12.   
    13.     public DatabaseHelper(Context context) {  
    14.         super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    15.     }  
    16.   
    17.     @Override  
    18.     public void onCreate(SQLiteDatabase db) {  
    19.         // 创建programmer表  
    20.         db.execSQL("CREATE TABLE " + Provider.ProgrammerColumns.TABLE_NAME + " ("  
    21.                 + Provider.ProgrammerColumns._ID + " INTEGER PRIMARY KEY,"  
    22.                 + Provider.ProgrammerColumns.NAME + " TEXT,"  
    23.                 + Provider.ProgrammerColumns.AGE + " INTEGER"  
    24.                 + ");");  
    25.           
    26.         // 创建leader表  
    27.         db.execSQL("CREATE TABLE " + Provider.LeaderColumns.TABLE_NAME + " ("  
    28.                 + Provider.LeaderColumns._ID + " INTEGER PRIMARY KEY,"  
    29.                 + Provider.LeaderColumns.NAME + " TEXT,"  
    30.                 + Provider.LeaderColumns.TITLE + " TEXT,"  
    31.                 + Provider.LeaderColumns.LEVEL + " INTEGER"  
    32.                 + ");");  
    33.     }  
    34.   
    35.     @Override  
    36.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    37.         db.execSQL("DROP TABLE IF EXISTS " + Provider.ProgrammerColumns.TABLE_NAME);  
    38.         db.execSQL("DROP TABLE IF EXISTS " + Provider.LeaderColumns.TABLE_NAME);  
    39.         onCreate(db);  
    40.     }  
    41. }  


    保存跟数据库及表有关的常量:
    Provider.java

    [java] view plaincopy
     
     
    1. package com.jacp.demo.provider;  
    2.   
    3. import android.net.Uri;  
    4. import android.provider.BaseColumns;  
    5.   
    6. /** 
    7.  * 保存数据库中的常量 
    8.  * @author jacp 
    9.  * 
    10.  */  
    11. public class Provider {  
    12.       
    13.     public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.jacp.demo";  
    14.   
    15.     public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.jacp.demo";  
    16.   
    17.     /** 
    18.      * 保存programmer表中用到的常量 
    19.      * @author jacp 
    20.      * 
    21.      */  
    22.     public static final class ProgrammerColumns implements BaseColumns {  
    23.         // 注意两张表的authority要不一样  
    24.         public static final String AUTHORITY = "com.jacp.provider.demo.programmer";  
    25.         public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY +"/programmers");  
    26.         public static final String TABLE_NAME = "programmer";  
    27.         public static final String DEFAULT_SORT_ORDER = "age desc";  
    28.           
    29.         public static final String NAME = "name";  
    30.         public static final String AGE = "age";  
    31.           
    32.     }  
    33.       
    34.     /** 
    35.      * 保存leader表中用到的常量 
    36.      * @author mayliang 
    37.      * 
    38.      */  
    39.     public static final class LeaderColumns implements BaseColumns {  
    40.         public static final String AUTHORITY = "com.jacp.provider.demo.leader";  
    41.         public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY +"/leaders");  
    42.         public static final String TABLE_NAME = "leader";  
    43.         public static final String DEFAULT_SORT_ORDER = "level desc";  
    44.           
    45.         public static final String NAME = "name";  
    46.         public static final String TITLE = "title";  
    47.         public static final String LEVEL = "level";  
    48.           
    49.     }  
    50.       
    51. }  

    对leader表进行增删改查操作的ContentProvider类:

    LeaderProvider.java

    [java] view plaincopy
     
     
    1. package com.jacp.demo.provider;  
    2.   
    3. import java.util.HashMap;  
    4.   
    5. import android.content.ContentProvider;  
    6. import android.content.ContentUris;  
    7. import android.content.ContentValues;  
    8. import android.content.UriMatcher;  
    9. import android.database.Cursor;  
    10. import android.database.SQLException;  
    11. import android.database.sqlite.SQLiteDatabase;  
    12. import android.database.sqlite.SQLiteQueryBuilder;  
    13. import android.net.Uri;  
    14. import android.text.TextUtils;  
    15.   
    16. import com.jacp.database.DatabaseHelper;  
    17.   
    18. /** 
    19.  * 对leader表进行操作的ContentProvider 
    20.  * @author jacp 
    21.  * 
    22.  */  
    23. public class LeaderProvider extends ContentProvider {  
    24.   
    25.     private static HashMap<String, String> sLeadersProjectionMap;  
    26.   
    27.     private static final int LEADERS = 1;  
    28.     private static final int LEADER_ID = 2;  
    29.   
    30.     private static final UriMatcher sUriMatcher;  
    31.   
    32.     private DatabaseHelper mOpenHelper;  
    33.   
    34.     @Override  
    35.     public boolean onCreate() {  
    36.         mOpenHelper = new DatabaseHelper(getContext());  
    37.         return true;  
    38.     }  
    39.   
    40.     @Override  
    41.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,  
    42.             String sortOrder) {  
    43.         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  
    44.         qb.setTables(Provider.LeaderColumns.TABLE_NAME);  
    45.   
    46.         switch (sUriMatcher.match(uri)) {  
    47.         case LEADERS:  
    48.             qb.setProjectionMap(sLeadersProjectionMap);  
    49.             break;  
    50.   
    51.         case LEADER_ID:  
    52.             qb.setProjectionMap(sLeadersProjectionMap);  
    53.             qb.appendWhere(Provider.LeaderColumns._ID + "=" + uri.getPathSegments().get(1));  
    54.             break;  
    55.   
    56.         default:  
    57.             throw new IllegalArgumentException("Unknown URI " + uri);  
    58.         }  
    59.   
    60.         // If no sort order is specified use the default  
    61.         String orderBy;  
    62.         if (TextUtils.isEmpty(sortOrder)) {  
    63.             orderBy = Provider.LeaderColumns.DEFAULT_SORT_ORDER;  
    64.         } else {  
    65.             orderBy = sortOrder;  
    66.         }  
    67.   
    68.         // Get the database and run the query  
    69.         SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
    70.         Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);  
    71.   
    72.         // Tell the cursor what uri to watch, so it knows when its source data changes  
    73.         c.setNotificationUri(getContext().getContentResolver(), uri);  
    74.         return c;  
    75.     }  
    76.   
    77.     @Override  
    78.     public String getType(Uri uri) {  
    79.         switch (sUriMatcher.match(uri)) {  
    80.         case LEADERS:  
    81.             return Provider.CONTENT_TYPE;  
    82.         case LEADER_ID:  
    83.             return Provider.CONTENT_ITEM_TYPE;  
    84.         default:  
    85.             throw new IllegalArgumentException("Unknown URI " + uri);  
    86.         }  
    87.     }  
    88.   
    89.     @Override  
    90.     public Uri insert(Uri uri, ContentValues initialValues) {  
    91.         // Validate the requested uri  
    92.         if (sUriMatcher.match(uri) != LEADERS) {  
    93.             throw new IllegalArgumentException("Unknown URI " + uri);  
    94.         }  
    95.   
    96.         ContentValues values;  
    97.         if (initialValues != null) {  
    98.             values = new ContentValues(initialValues);  
    99.         } else {  
    100.             values = new ContentValues();  
    101.         }  
    102.   
    103.         // Make sure that the fields are all set  
    104.         if (values.containsKey(Provider.LeaderColumns.NAME) == false) {  
    105.             values.put(Provider.LeaderColumns.NAME, "");  
    106.         }  
    107.           
    108.         if (values.containsKey(Provider.LeaderColumns.TITLE) == false) {  
    109.             values.put(Provider.LeaderColumns.TITLE, "");  
    110.         }  
    111.   
    112.         if (values.containsKey(Provider.LeaderColumns.LEVEL) == false) {  
    113.             values.put(Provider.LeaderColumns.LEVEL, 0);  
    114.         }  
    115.   
    116.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
    117.         long rowId = db.insert(Provider.LeaderColumns.TABLE_NAME, Provider.LeaderColumns.NAME, values);  
    118.         if (rowId > 0) {  
    119.             Uri noteUri = ContentUris.withAppendedId(Provider.LeaderColumns.CONTENT_URI, rowId);  
    120.             getContext().getContentResolver().notifyChange(noteUri, null);  
    121.             return noteUri;  
    122.         }  
    123.   
    124.         throw new SQLException("Failed to insert row into " + uri);  
    125.     }  
    126.   
    127.     @Override  
    128.     public int delete(Uri uri, String where, String[] whereArgs) {  
    129.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
    130.         int count;  
    131.         switch (sUriMatcher.match(uri)) {  
    132.         case LEADERS:  
    133.             count = db.delete(Provider.LeaderColumns.TABLE_NAME, where, whereArgs);  
    134.             break;  
    135.   
    136.         case LEADER_ID:  
    137.             String noteId = uri.getPathSegments().get(1);  
    138.             count = db.delete(Provider.LeaderColumns.TABLE_NAME, Provider.LeaderColumns._ID + "=" + noteId  
    139.                     + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);  
    140.             break;  
    141.   
    142.         default:  
    143.             throw new IllegalArgumentException("Unknown URI " + uri);  
    144.         }  
    145.   
    146.         getContext().getContentResolver().notifyChange(uri, null);  
    147.         return count;  
    148.     }  
    149.   
    150.     @Override  
    151.     public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {  
    152.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
    153.         int count;  
    154.         switch (sUriMatcher.match(uri)) {  
    155.         case LEADERS:  
    156.             count = db.update(Provider.LeaderColumns.TABLE_NAME, values, where, whereArgs);  
    157.             break;  
    158.   
    159.         case LEADER_ID:  
    160.             String noteId = uri.getPathSegments().get(1);  
    161.             count = db.update(Provider.LeaderColumns.TABLE_NAME, values, Provider.LeaderColumns._ID + "=" + noteId  
    162.                     + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);  
    163.             break;  
    164.   
    165.         default:  
    166.             throw new IllegalArgumentException("Unknown URI " + uri);  
    167.         }  
    168.   
    169.         getContext().getContentResolver().notifyChange(uri, null);  
    170.         return count;  
    171.     }  
    172.   
    173.     static {  
    174.         sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
    175.         sUriMatcher.addURI(Provider.LeaderColumns.AUTHORITY, "leaders", LEADERS);  
    176.         sUriMatcher.addURI(Provider.LeaderColumns.AUTHORITY, "leaders/#", LEADER_ID);  
    177.   
    178.         sLeadersProjectionMap = new HashMap<String, String>();  
    179.         sLeadersProjectionMap.put(Provider.LeaderColumns._ID, Provider.LeaderColumns._ID);  
    180.         sLeadersProjectionMap.put(Provider.LeaderColumns.NAME, Provider.LeaderColumns.NAME);  
    181.         sLeadersProjectionMap.put(Provider.LeaderColumns.TITLE, Provider.LeaderColumns.TITLE);  
    182.         sLeadersProjectionMap.put(Provider.LeaderColumns.LEVEL, Provider.LeaderColumns.LEVEL);  
    183.     }  
    184. }  

    对programmer表进行增删改查操作的ContentProvider类:

    ProgrammerProvider.java

    [java] view plaincopy
     
     
    1. package com.jacp.demo.provider;  
    2.   
    3. import java.util.HashMap;  
    4.   
    5. import android.content.ContentProvider;  
    6. import android.content.ContentUris;  
    7. import android.content.ContentValues;  
    8. import android.content.UriMatcher;  
    9. import android.database.Cursor;  
    10. import android.database.SQLException;  
    11. import android.database.sqlite.SQLiteDatabase;  
    12. import android.database.sqlite.SQLiteQueryBuilder;  
    13. import android.net.Uri;  
    14. import android.text.TextUtils;  
    15.   
    16. import com.jacp.database.DatabaseHelper;  
    17.   
    18. /** 
    19.  * 对programmer表进行操作的ContentProvider 
    20.  * @author jacp 
    21.  * 
    22.  */  
    23. public class ProgrammerProvider extends ContentProvider {  
    24.   
    25.     private static HashMap<String, String> sprogrammersProjectionMap;  
    26.   
    27.     private static final int PROGRAMMERS = 1;  
    28.     private static final int PROGRAMMERS_ID = 2;  
    29.   
    30.     private static final UriMatcher sUriMatcher;  
    31.   
    32.     private DatabaseHelper mOpenHelper;  
    33.   
    34.     @Override  
    35.     public boolean onCreate() {  
    36.         mOpenHelper = new DatabaseHelper(getContext());  
    37.         return true;  
    38.     }  
    39.   
    40.     @Override  
    41.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,  
    42.             String sortOrder) {  
    43.         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  
    44.         qb.setTables(Provider.ProgrammerColumns.TABLE_NAME);  
    45.   
    46.         switch (sUriMatcher.match(uri)) {  
    47.         case PROGRAMMERS:  
    48.             qb.setProjectionMap(sprogrammersProjectionMap);  
    49.             break;  
    50.   
    51.         case PROGRAMMERS_ID:  
    52.             qb.setProjectionMap(sprogrammersProjectionMap);  
    53.             qb.appendWhere(Provider.ProgrammerColumns._ID + "=" + uri.getPathSegments().get(1));  
    54.             break;  
    55.   
    56.         default:  
    57.             throw new IllegalArgumentException("Unknown URI " + uri);  
    58.         }  
    59.   
    60.         // If no sort order is specified use the default  
    61.         String orderBy;  
    62.         if (TextUtils.isEmpty(sortOrder)) {  
    63.             orderBy = Provider.ProgrammerColumns.DEFAULT_SORT_ORDER;  
    64.         } else {  
    65.             orderBy = sortOrder;  
    66.         }  
    67.   
    68.         // Get the database and run the query  
    69.         SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
    70.         Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);  
    71.   
    72.         // Tell the cursor what uri to watch, so it knows when its source data changes  
    73.         c.setNotificationUri(getContext().getContentResolver(), uri);  
    74.         return c;  
    75.     }  
    76.   
    77.     @Override  
    78.     public String getType(Uri uri) {  
    79.         switch (sUriMatcher.match(uri)) {  
    80.         case PROGRAMMERS:  
    81.             return Provider.CONTENT_TYPE;  
    82.         case PROGRAMMERS_ID:  
    83.             return Provider.CONTENT_ITEM_TYPE;  
    84.         default:  
    85.             throw new IllegalArgumentException("Unknown URI " + uri);  
    86.         }  
    87.     }  
    88.   
    89.     @Override  
    90.     public Uri insert(Uri uri, ContentValues initialValues) {  
    91.         // Validate the requested uri  
    92.         if (sUriMatcher.match(uri) != PROGRAMMERS) {  
    93.             throw new IllegalArgumentException("Unknown URI " + uri);  
    94.         }  
    95.   
    96.         ContentValues values;  
    97.         if (initialValues != null) {  
    98.             values = new ContentValues(initialValues);  
    99.         } else {  
    100.             values = new ContentValues();  
    101.         }  
    102.   
    103.         // Make sure that the fields are all set  
    104.         if (values.containsKey(Provider.ProgrammerColumns.NAME) == false) {  
    105.             values.put(Provider.ProgrammerColumns.NAME, "");  
    106.         }  
    107.   
    108.         if (values.containsKey(Provider.ProgrammerColumns.AGE) == false) {  
    109.             values.put(Provider.ProgrammerColumns.AGE, 0);  
    110.         }  
    111.   
    112.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
    113.         long rowId = db.insert(Provider.ProgrammerColumns.TABLE_NAME, Provider.ProgrammerColumns.NAME, values);  
    114.         if (rowId > 0) {  
    115.             Uri noteUri = ContentUris.withAppendedId(Provider.ProgrammerColumns.CONTENT_URI, rowId);  
    116.             getContext().getContentResolver().notifyChange(noteUri, null);  
    117.             return noteUri;  
    118.         }  
    119.   
    120.         throw new SQLException("Failed to insert row into " + uri);  
    121.     }  
    122.   
    123.     @Override  
    124.     public int delete(Uri uri, String where, String[] whereArgs) {  
    125.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
    126.         int count;  
    127.         switch (sUriMatcher.match(uri)) {  
    128.         case PROGRAMMERS:  
    129.             count = db.delete(Provider.ProgrammerColumns.TABLE_NAME, where, whereArgs);  
    130.             break;  
    131.   
    132.         case PROGRAMMERS_ID:  
    133.             String noteId = uri.getPathSegments().get(1);  
    134.             count = db.delete(Provider.ProgrammerColumns.TABLE_NAME, Provider.ProgrammerColumns._ID + "=" + noteId  
    135.                     + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);  
    136.             break;  
    137.   
    138.         default:  
    139.             throw new IllegalArgumentException("Unknown URI " + uri);  
    140.         }  
    141.   
    142.         getContext().getContentResolver().notifyChange(uri, null);  
    143.         return count;  
    144.     }  
    145.   
    146.     @Override  
    147.     public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {  
    148.         SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
    149.         int count;  
    150.         switch (sUriMatcher.match(uri)) {  
    151.         case PROGRAMMERS:  
    152.             count = db.update(Provider.ProgrammerColumns.TABLE_NAME, values, where, whereArgs);  
    153.             break;  
    154.   
    155.         case PROGRAMMERS_ID:  
    156.             String noteId = uri.getPathSegments().get(1);  
    157.             count = db.update(Provider.ProgrammerColumns.TABLE_NAME, values, Provider.ProgrammerColumns._ID + "=" + noteId  
    158.                     + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);  
    159.             break;  
    160.   
    161.         default:  
    162.             throw new IllegalArgumentException("Unknown URI " + uri);  
    163.         }  
    164.   
    165.         getContext().getContentResolver().notifyChange(uri, null);  
    166.         return count;  
    167.     }  
    168.   
    169.     static {  
    170.         sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
    171.         sUriMatcher.addURI(Provider.ProgrammerColumns.AUTHORITY, "programmers", PROGRAMMERS);  
    172.         sUriMatcher.addURI(Provider.ProgrammerColumns.AUTHORITY, "programmers/#", PROGRAMMERS_ID);  
    173.   
    174.         sprogrammersProjectionMap = new HashMap<String, String>();  
    175.         sprogrammersProjectionMap.put(Provider.ProgrammerColumns._ID, Provider.ProgrammerColumns._ID);  
    176.         sprogrammersProjectionMap.put(Provider.ProgrammerColumns.NAME, Provider.ProgrammerColumns.NAME);  
    177.         sprogrammersProjectionMap.put(Provider.ProgrammerColumns.AGE, Provider.ProgrammerColumns.AGE);  
    178.     }  
    179. }  

    保存leader表的数据对象:

    Leader.java

    [java] view plaincopy
     
     
    1. package com.jacp.pojos;  
    2.   
    3. public class Leader {  
    4.   
    5.     public String name;  
    6.     public String title;  
    7.     public int level;  
    8. }  

    保存Programmer表的数据对象:

    Programmer.java

    [java] view plaincopy
     
     
    1. package com.jacp.pojos;  
    2.   
    3. public class Programmer {  
    4.   
    5.     public String name;  
    6.     public int age;  
    7. }  

    Activity测试:

    [java] view plaincopy
     
     
    1. package com.jacp.demo;  
    2.   
    3. import android.app.Activity;  
    4. import android.content.ContentValues;  
    5. import android.database.Cursor;  
    6. import android.net.Uri;  
    7. import android.os.Bundle;  
    8. import android.text.TextUtils;  
    9. import android.util.Log;  
    10.   
    11. import com.jacp.demo.provider.Provider;  
    12. import com.jacp.pojos.Leader;  
    13. import com.jacp.pojos.Programmer;  
    14.   
    15. public class ContentProviderDemoActivity extends Activity {  
    16.       
    17.     private static final String TAG = "ProviderActivity";  
    18.       
    19.     @Override  
    20.     public void onCreate(Bundle savedInstanceState) {  
    21.         super.onCreate(savedInstanceState);  
    22.         setContentView(R.layout.main);  
    23.           
    24.         testLeader();  
    25.         testProgrammer();  
    26.     }  
    27.       
    28.     private void testProgrammer() {  
    29.         Programmer p = new Programmer();  
    30.         p.name = "jacp";  
    31.         p.age = 99;  
    32.         int id = insertProgrammer(p);  
    33.         queryProgrammer(id);  
    34.     }  
    35.       
    36.     private int insertProgrammer(Programmer programmer) {  
    37.         ContentValues values = new ContentValues();  
    38.         values.put(Provider.ProgrammerColumns.NAME, programmer.name);  
    39.         values.put(Provider.ProgrammerColumns.AGE, programmer.age);  
    40.         Uri uri = getContentResolver().insert(Provider.ProgrammerColumns.CONTENT_URI, values);  
    41.         Log.i(TAG, "insert uri="+uri);  
    42.         String lastPath = uri.getLastPathSegment();  
    43.         if (TextUtils.isEmpty(lastPath)) {  
    44.             Log.i(TAG, "insert failure!");  
    45.         } else {  
    46.             Log.i(TAG, "insert success! the id is " + lastPath);  
    47.         }  
    48.           
    49.         return Integer.parseInt(lastPath);  
    50.     }  
    51.       
    52.     private void queryProgrammer(int id) {  
    53.         Cursor c = getContentResolver().query(Provider.ProgrammerColumns.CONTENT_URI, new String[] { Provider.ProgrammerColumns.NAME, Provider.ProgrammerColumns.AGE }, Provider.ProgrammerColumns._ID + "=?", new String[] { id + "" }, null);  
    54.         if (c != null && c.moveToFirst()) {  
    55.             Programmer p = new Programmer();  
    56.             p.name = c.getString(c.getColumnIndexOrThrow(Provider.ProgrammerColumns.NAME));  
    57.             p.age = c.getInt(c.getColumnIndexOrThrow(Provider.ProgrammerColumns.AGE));  
    58.             c.close(); // 用完Cursor要释放资源,如果Cursor没有关闭系统会打出Error级别的Log  
    59.             Log.i(TAG, "programmer.name="+p.name+"---programmer.age="+p.age);  
    60.         } else {  
    61.             Log.i(TAG, "query failure!");  
    62.         }  
    63.     }  
    64.       
    65.     private void testLeader() {  
    66.         Leader leader = new Leader();  
    67.         leader.name = "jacky";  
    68.         leader.title = "CTO";  
    69.         leader.level = 30;  
    70.         int id = insertLeader(leader);  
    71.         queryLeader(id);  
    72.     }  
    73.       
    74.     private int insertLeader(Leader leader) {  
    75.         ContentValues values = new ContentValues();  
    76.         values.put(Provider.LeaderColumns.NAME, leader.name);  
    77.         values.put(Provider.LeaderColumns.TITLE, leader.title);  
    78.         values.put(Provider.LeaderColumns.LEVEL, leader.level);  
    79.         Uri uri = getContentResolver().insert(Provider.LeaderColumns.CONTENT_URI, values);  
    80.         Log.i(TAG, "insert uri="+uri);  
    81.         String lastPath = uri.getLastPathSegment();  
    82.         if (TextUtils.isEmpty(lastPath)) {  
    83.             Log.i(TAG, "insert failure!");  
    84.         } else {  
    85.             Log.i(TAG, "insert success! the id is " + lastPath);  
    86.         }  
    87.           
    88.         return Integer.parseInt(lastPath);  
    89.     }  
    90.       
    91.     private void queryLeader(int id) {  
    92.         Cursor c = getContentResolver().query(Provider.LeaderColumns.CONTENT_URI, new String[] { Provider.LeaderColumns.NAME, Provider.LeaderColumns.TITLE, Provider.LeaderColumns.LEVEL }, Provider.LeaderColumns._ID + "=?", new String[] { id + "" }, null);  
    93.         if (c != null && c.moveToFirst()) {  
    94.             Leader leader = new Leader();  
    95.             leader.name = c.getString(c.getColumnIndexOrThrow(Provider.LeaderColumns.NAME));  
    96.             leader.title = c.getString(c.getColumnIndexOrThrow(Provider.LeaderColumns.TITLE));  
    97.             leader.level = c.getInt(c.getColumnIndexOrThrow(Provider.LeaderColumns.LEVEL));  
    98.             Log.i(TAG, "leader.name="+leader.name+"---leader.title="+leader.title+"---leader.level="+leader.level);  
    99.         } else {  
    100.             Log.i(TAG, "query failure!");  
    101.         }  
    102.     }  
    103. }  

    Manifest.xml文件中的注册(要注意的地方,下面已标注):

    [html] view plaincopy
     
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     package="com.jacp.demo"  
    4.     android:versionCode="1"  
    5.     android:versionName="1.0" >  
    6.   
    7.     <uses-sdk android:minSdkVersion="8" />  
    8.   
    9.     <application  
    10.         android:icon="@drawable/ic_launcher"  
    11.         android:label="@string/app_name" >  
    12.         <activity  
    13.             android:label="@string/app_name"  
    14.             android:name=".ContentProviderDemoActivity" >  
    15.             <intent-filter >  
    16.                 <action android:name="android.intent.action.MAIN" />  
    17.   
    18.                 <category android:name="android.intent.category.LAUNCHER" />  
    19.             </intent-filter>  
    20.         </activity>  
    21.           
    22.         <!-- 这个地方的两个provider的authories要不一样,否则找不到对应ContentProvider处理出现 java.lang.IllegalArgumentException: Unknown URI异常 -->  
    23.         <provider android:name=".provider.ProgrammerProvider"  
    24.             android:authorities="com.jacp.provider.demo.programmer" />  
    25.           
    26.         <provider android:name=".provider.LeaderProvider"  
    27.             android:authorities="com.jacp.provider.demo.leader" />  
    28.     </application>  
    29.   
    30. </manifest>  

    demo下载地址:http://download.csdn.net/detail/maylian7700/4150144

    如有遗漏不当之处,欢迎批评指正!

  • 相关阅读:
    夺命雷公狗---node.js---21之项目的构建在node+express+mongo的博客项目6之数据的遍历
    夺命雷公狗---node.js---20之项目的构建在node+express+mongo的博客项目5mongodb在项目中实现添加数据
    夺命雷公狗---node.js---19之项目的构建在node+express+mongo的博客项目4mongodb在项目中的基本引入
    夺命雷公狗---node.js---18之项目的构建在node+express+mongo的博客项目3头尾左侧分离法
    夺命雷公狗---node.js---17之项目的构建在node+express+mongo的博客项目2之一,二级路由
    夺命雷公狗---node.js---16之项目的构建在node+express+mongo的博客项目1
    夺命雷公狗---node.js---15之加密
    夺命雷公狗---node.js---14之DNS
    夺命雷公狗---node.js---13之Buffer的转换
    夺命雷公狗---node.js---12之fs模块文件的操作
  • 原文地址:https://www.cnblogs.com/wanqieddy/p/3833591.html
Copyright © 2011-2022 走看看