Content Providers--怎样去访问一个基本的content provider


一个content provider 管理着怎样去访问存储在应用仓库中的数据。一个content provider是一个应用程序的一部分,它常常用来使应用程序的界面工作在它提供的数据基础上。然而,content providers 主要是用来给其它的应用程序使用的,使用一个provider客户端对象来访问使用它。总之,providers和provider 客户端对象为应用中的数据提供一个一致的、标准的访问接口,并且它也能够处理跨进程间的通信和敏感数据的访问

Accessing a provider

我们可以使用   ContentResolver  客户端对象去访问一个content provider,我们可以用   ContentResolver  实现对content provider提供的数据源进行CRUD

  ContentResolver  对象是运行在应用的主线程中的,有可能会阻塞主线程,它 不用做过多的操作就可以 进行跨进程间的通信,它担当着本身仓库数据和外部表数据的沟通者

当访问一个provider时,你需要在manifest文件中增加 Content Provider Permissions权限声明

我们可以使用URI去定位一个content provider,使用SQL语句描述我们要进行的操作

data as table words
word app id frequency locale _ID
mapreduce user1 100 en_US 1
precompiler user14 200 fr_FR 2
applet user2 225 fr_CA 3
const user1 255 pt_BR 4
int user5 100 en_UK 5


查询操作
     
     当我们进行查询时,并不像我们用一个url去定位一个资源时那样,一股脑的把所有的数据都返回回来,而是返回一个Cursor对象,让我们可以更明智的获取数据
      SQL : select _ID,word,locale from words where word = ?
private void accessContract(String mSearchString){
             
             Log. e(TAG, mSearchString);
             
              //uri 定位
             Uri uri = UserDictionary.Words. CONTENT_URI;
              //access a single row in a table
              //Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI, 3);
             
              // A "projection" defines the columns that will be returned for each row
              // 要查询的字段
             String[] mProjection =
             {
                 UserDictionary.Words. _ID,    // Contract class constant for the _ID column name
                 UserDictionary.Words. WORD,   // Contract class constant for the word column name
                 UserDictionary.Words. LOCALE  // Contract class constant for the locale column name
             };

              // Defines a string to contain the selection clause
              // 查询条件
             String mSelectionClause = null;

              // Initializes an array to contain selection arguments
              // 查询条件的值
             String[] mSelectionArgs = { ""};
             
              // Remember to insert code here to check for invalid or malicious input.

              // If the word is the empty string, gets everything
              if (TextUtils.isEmpty(mSearchString)) {
                 // Setting the selection clause to null will return all words
                 mSelectionClause = null;
                 mSelectionArgs[0] = "";

             } else {
                 // Constructs a selection clause that matches the word that the user entered.
                 mSelectionClause = UserDictionary.Words. WORD + " = ?" ;
                 // Moves the user's input string to the selection arguments.
                 mSelectionArgs[0] = mSearchString;

             }
             
              // Queries the user dictionary and returns results
             Cursor mCursor = getContentResolver().query(
                    uri,   // The content URI of the words table
                 mProjection,                        // The columns to return for each row
                 mSelectionClause,                    // Selection criteria
                 //null,
                 mSelectionArgs,                     // Selection criteria
                 //null,
                 UserDictionary.Words. WORD);                        // The sort order for the returned rows
             
              //last generate sql
              //SELECT _ID, word, frequency, locale FROM words WHERE word = <userinput> ORDER BY word ASC;
             
              // Some providers return null if an error occurs, others throw an exception
              if (null == mCursor) {
                 /*
                  * Insert code here to handle the error. Be sure not to use the cursor! You may want to
                  * call android.util.Log.e() to log this error.
                  *
                  */
              // If the Cursor is empty, the provider found no matches
                    
                    Log. e(TAG, "mCursor is null");
             } else if (mCursor.getCount() < 1) {

                 /*
                  * Insert code here to notify the user that the search was unsuccessful. This isn't necessarily
                  * an error. You may want to offer the user the option to insert a new row, or re-type the
                  * search term.
                  */
                    Log. e(TAG, "mCursor is empty");
             } else {
                 // Insert code here to do something with the results
                    Log. e(TAG, "mCursor is not empty");
                     //display(mCursor);
             }
             
              //mCursor.close();
       }

插入操作

     用ContentValues封装要插入的字段和值
     SQL: insert into words(_ID,locale,word,frequency) values (?,?,?,?)
       private void insert(){
              // Defines a new Uri object that receives the result of the insertion
             Uri mNewUri;

              //...

              // Defines an object to contain the new values to insert
             ContentValues mNewValues = new ContentValues();

              /*
              * Sets the values of each column and inserts the word. The arguments to the "put"
              * method are "column name" and "value"
              */
              mNewValues.put(UserDictionary.Words. APP_ID, "example.user" );
              mNewValues.put(UserDictionary.Words. LOCALE, "en_US" );
              mNewValues.put(UserDictionary.Words. WORD, "insert" );
              mNewValues.put(UserDictionary.Words. FREQUENCY, "100" );

             mNewUri = getContentResolver().insert(
                 UserDictionary.Words. CONTENT_URI,   // the user dictionary content URI
                 mNewValues                          // the values to insert
             );
             
             Log. e(TAG, mNewUri.getPath());
       }



更新操作      

SQL: update words set locale=? where locale=?
          private void update(){
              // Defines an object to contain the updated values
             ContentValues mUpdateValues = new ContentValues();

              // Defines selection criteria for the rows you want to update
             String mSelectionClause = UserDictionary.Words.LOCALE +  " LIKE ?";
             String[] mSelectionArgs = { "en_%"};

              // Defines a variable to contain the number of updated rows
              int mRowsUpdated = 0;

              //...

              /*
              * Sets the updated value and updates the selected words.
              */
             mUpdateValues.putNull(UserDictionary.Words. LOCALE);

             mRowsUpdated = getContentResolver().update(
                 UserDictionary.Words. CONTENT_URI,   // the user dictionary content URI
                 mUpdateValues,                       // the columns to update
                 mSelectionClause,                    // the column to select on
                 mSelectionArgs                      // the value to compare to
             );
       
             Log. e(TAG, "effect row "+mRowsUpdated);
             
       }



删除操作

SQL:delete from words where word=?
        private void delete(){
              // Defines selection criteria for the rows you want to delete
             String mSelectionClause = UserDictionary.Words. WORD + " = ?" ;
             String[] mSelectionArgs = { "insert"};

              // Defines a variable to contain the number of rows deleted
              int mRowsDeleted = 0;

              //...

              // Deletes the words that match the selection criteria
             mRowsDeleted = getContentResolver().delete(
                 UserDictionary.Words. CONTENT_URI,   // the user dictionary content URI
                 mSelectionClause,                    // the column to select on
                 mSelectionArgs                      // the value to compare to
             );
             
             Log. e(TAG, "delete effect row "+mRowsDeleted);
       }



使用SimpleCursorAdapter方便的来显示一个数据源数据

             private void display(Cursor mCursor) {
              // Defines a list of columns to retrieve from the Cursor and load into an output row
             String[] mWordListColumns =
             {
                 UserDictionary.Words. WORD,   // Contract class constant containing the word column name
                 UserDictionary.Words. LOCALE  // Contract class constant containing the locale column name
             };

              // Defines a list of View IDs that will receive the Cursor columns for each row
              int[] mWordListItems = { R.id.dictWord, R.id.locale};

              // Creates a new SimpleCursorAdapter
             SimpleCursorAdapter mCursorAdapter = new SimpleCursorAdapter(
                 getApplicationContext(),               // The application's Context object
                 R.layout. wordlist_item,                  // A layout in XML for one row in the ListView
                 mCursor,                               // The result from the query
                 mWordListColumns,                      // A string array of column names in the cursor
                 mWordListItems                        // An integer array of view IDs in the row layout
                 );                                    // Flags (usually none are needed)

              // Sets the adapter for the ListView
              mWordList.setAdapter(mCursorAdapter);
       }


你可能感兴趣的:(Content Providers--怎样去访问一个基本的content provider)