Android中ContentProvider詳解

在 Android中,對於數據的存貯,有幾種方式,有文件方式,有文件式數據庫方式,網絡數據,Android自帶了一個SQLite數據庫,做嵌入開發的人對這個跨平臺的本地文件數據庫一定不會陌生,在Android對於數據的訪問,提出了新的方式,ContentProvider方式,我們首先來看看SQLite在 Android中的使用,在Android中有最簡單的使用方式,就是利Context對象的openorCreateDatabase
我們來看看一段代碼:

Java代碼 複製代碼 收藏代碼
  1. import android.app.Activity;   
  2. import android.content.Intent;   
  3. import android.database.Cursor;   
  4. import android.database.sqlite.SQLiteDatabase;   
  5. import android.os.Bundle;   
  6. import android.view.Menu;   
  7. import android.view.MenuItem;   
  8. import android.widget.TextView;   
  9.   
  10. public class DBActivity extends Activity {   
  11.  private SQLiteDatabase mdb = null;   
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {   
  15.         super.onCreate(savedInstanceState);   
  16.         initDatabase();   
  17.         setContentView(R.layout.main);           
  18.     }   
  19.     @Override  
  20.  public boolean onCreateOptionsMenu(Menu menu) {   
  21.   // TODO Auto-generated method stub   
  22.   super.onCreateOptionsMenu(menu);      
  23.   menu.add(1, Menu.FIRST +11"GetName");     
  24.   menu.add(1, Menu.FIRST +22"Test");      
  25.   return true;     
  26.  }   
  27.        
  28.     public boolean onOptionsItemSelected(MenuItem item) {   
  29.   // TODO Auto-generated method stub   
  30.   super.onOptionsItemSelected(item);   
  31.   switch (item.getItemId())   
  32.   {   
  33.    case Menu.FIRST+ 1:   
  34.    {   
  35.     TextView tv = (TextView)this.findViewById(R.id.view_main);   
  36.     tv.setText(this.getName());   
  37.     break;   
  38.    }   
  39.    case Menu.FIRST + 2:   
  40.    {   
  41.     this.setTitle("Del Item...");   
  42.     break;   
  43.    }      
  44.   }   
  45.   return true;   
  46.  }   
  47.        
  48.     private void initDatabase()   
  49.     {   
  50.      mdb = this.openOrCreateDatabase("dbfile"0null);   
  51.      String sql_create = "create table test (id int, name TEXT)";   
  52.      mdb.execSQL(sql_create);   
  53.      String sql_insert = "insert into test(id, name) values(3, 'name3')";   
  54.      mdb.execSQL(sql_insert);   
  55.     }   
  56.     private String getName()   
  57.     {   
  58.      String name = null;   
  59.         
  60.      Cursor cur = mdb.rawQuery("select * from test"null);   
  61.      cur.moveToFirst();   
  62.      while (!cur.isLast())   
  63.      {   
  64.       name = name  + cur.getString(1)+ "\r\n";   
  65.       cur.moveToNext();   
  66.      }   
  67.      return name;   
  68.     }   
  69. }  

 我們再來看看單獨使用SQLiteOpenHelper方式:
先由SQLiteOpenHelper繼承一個數據庫操作類,其中onCreate, onUpgrade必須重載並實現,

Java代碼 複製代碼 收藏代碼
  1. import android.content.Context;   
  2. import android.database.Cursor;   
  3. import android.database.sqlite.SQLiteDatabase;   
  4. import android.database.sqlite.SQLiteOpenHelper;   
  5.   
  6. public class DatabaseHelper extends SQLiteOpenHelper {   
  7.  @Override  
  8.  public void onCreate(SQLiteDatabase db) {   
  9.   // TODO Auto-generated method stub     
  10.  }   
  11.  @Override  
  12.  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {   
  13.   // TODO Auto-generated method stub     
  14.  }   
  15.  public DatabaseHelper(Context ct,String dbName)   
  16.  {    
  17.   super(ct,dbName,null,1);     
  18.  }    
  19.  public boolean insert(String insert)   
  20.  {   
  21.   this.getWritableDatabase().execSQL(insert);   
  22.   return true;   
  23.  }   
  24.  public boolean update(String update)   
  25.  {   
  26.   this.getWritableDatabase().execSQL(update);   
  27.   return true;   
  28.  }   
  29.  public boolean delete(String del)   
  30.  {   
  31.   this.getWritableDatabase().execSQL(del);   
  32.   return true;   
  33.  }   
  34.  public Cursor query(String query)   
  35.  {   
  36.   Cursor cur = this.getReadableDatabase().rawQuery(query, null);   
  37.   return cur;   
  38.  }   
  39. }  

 

再創建一個使用者(消費者)

Java代碼 複製代碼 收藏代碼
  1. import android.app.Activity;   
  2. import android.content.Intent;   
  3. import android.database.Cursor;   
  4. import android.database.sqlite.SQLiteDatabase;   
  5. import android.os.Bundle;   
  6. import android.view.Menu;   
  7. import android.view.MenuItem;   
  8. import android.widget.TextView;   
  9.   
  10. public class DBActivity extends Activity {   
  11.  private SQLiteDatabase mdb = null;   
  12.  private DatabaseHelper helper = null;   
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {   
  16.         super.onCreate(savedInstanceState);   
  17.         initDatabase();   
  18.         setContentView(R.layout.main);           
  19.     }   
  20.     @Override  
  21.  public boolean onCreateOptionsMenu(Menu menu) {   
  22.   // TODO Auto-generated method stub   
  23.   super.onCreateOptionsMenu(menu);      
  24.   menu.add(1, Menu.FIRST +11"GetName");     
  25.   menu.add(1, Menu.FIRST +22"Test");      
  26.   return true;     
  27.  }   
  28.        
  29.     public boolean onOptionsItemSelected(MenuItem item) {   
  30.   // TODO Auto-generated method stub   
  31.   super.onOptionsItemSelected(item);   
  32.   switch (item.getItemId())   
  33.   {   
  34.    case Menu.FIRST+ 1:   
  35.    {   
  36.     TextView tv = (TextView)this.findViewById(R.id.view_main);   
  37.     tv.setText(this.getName());   
  38.     break;   
  39.    }   
  40.    case Menu.FIRST + 2:   
  41.    {   
  42.     this.setTitle("Del Item...");   
  43.     break;   
  44.    }      
  45.   }   
  46.   return true;   
  47.  }   
  48.        
  49.     private void initDatabase()   
  50.     {   
  51.      helper = new DatabaseHelper(this,"dbfile");   
  52.      //mdb = this.openOrCreateDatabase("dbfile", 0, null);   
  53.      //String sql_create = "create table test (id int, name TEXT)";   
  54.      //mdb.execSQL(sql_create);   
  55.      String sql_insert = "insert into test(id, name) values(55, 'namexx')";   
  56.      //mdb.execSQL(sql_insert);   
  57.      helper.insert(sql_insert);   
  58.     }   
  59.     private String getName()   
  60.     {   
  61.      String name = null;     
  62.      //mdb = helper.getReadableDatabase();   
  63.      Cursor cur = helper.query("select * from test");   
  64.      cur.moveToFirst();   
  65.      do  
  66.      {   
  67.       name = name  + cur.getString(1)+ "\n";         
  68.          
  69.      } while(cur.moveToNext());         
  70.         
  71.      return name;   
  72.     }   
  73. }  

 在來看看使用ContentProvider

Java代碼 複製代碼 收藏代碼
  1. import android.content.ContentProvider;   
  2. import android.content.ContentValues;   
  3. import android.database.Cursor;   
  4. import android.net.Uri;   
  5. import android.widget.Toast;   
  6.   
  7. public class TestProvider extends ContentProvider {   
  8.     private DatabaseHelper mdbHelper = null;   
  9.     final static String TABLE_NAME = "test";   
  10.  @Override  
  11.  public int delete(Uri arg0, String arg1, String[] arg2) {   
  12.   mdbHelper.getWritableDatabase().delete(TABLE_NAME, arg1, arg2);   
  13.   return 0;   
  14.  }   
  15.   
  16.  @Override  
  17.  public String getType(Uri uri) {   
  18.   // TODO Auto-generated method stub   
  19.   return null;   
  20.  }   
  21.   
  22.  @Override  
  23.  public Uri insert(Uri uri, ContentValues values) {   
  24.   // TODO Auto-generated method stub   
  25.   mdbHelper.getWritableDatabase().insert(TABLE_NAME, "", values);   
  26.   return null;   
  27.  }   
  28.   
  29.  @Override  
  30.  public boolean onCreate() {   
  31.   // TODO Auto-generated method stub   
  32.   mdbHelper = new DatabaseHelper(this.getContext(), "dbfile");   
  33.   return true;   
  34.  }   
  35.   
  36.  @Override  
  37.  public Cursor query(Uri uri, String[] projection, String selection,   
  38.    String[] selectionArgs, String sortOrder) {   
  39.   Cursor cur = mdbHelper.getReadableDatabase().query(TABLE_NAME,projection,selection,null,null,nullnull);   
  40.   Toast.makeText(this.getContext(), "test Cur!", Toast.LENGTH_SHORT);   
  41.   return cur;   
  42.  }   
  43.   
  44.  @Override  
  45.  public int update(Uri uri, ContentValues values, String selection,   
  46.    String[] selectionArgs) {   
  47.   mdbHelper.getWritableDatabase().update(TABLE_NAME, values, selection, null);   
  48.   return 0;   
  49.  }   
  50.   
  51. }  

 

 老規矩,AndroidManifest.xml來定義這個Provider
<provider android:label="test_provider" android:authorities="com.my.provider" android:name="TestProvider">
    </provider>
這裏的
android:authorities = "com.my.provider"是標識這個ContentProvider,調用者可以根據這個標識來找到它,
我們組合一個能找到它的Uri,
public class ProviderConst {
 public static final Uri MY_TEST_URI = Uri.parse("content://com.my.provider/test");

}

content 指的是內容提供者ContentProvider。
//com.my.provider映射到我們已定義的那個ContentProvider標識
/test這個作爲一個參數,傳給ContentProvider,可以根據這個參數來決定操作目標,比如數據庫中的哪張表,文件中的那一部分數據等。

我們來操作這個內容提供者:

Java代碼 複製代碼 收藏代碼
  1. private String getName()   
  2.     {   
  3.      String name = null;         
  4.      Cursor cur = this.getContentResolver().query(ProviderConst.MY_TEST_URI,new String[]{"id","name"},nullnullnull);   
  5.      if (cur == null)   
  6.       return null;   
  7.      cur.moveToFirst();   
  8.      do  
  9.      {   
  10.       name = name  + cur.getString(1)+ "\n";         
  11.          
  12.      } while(cur.moveToNext());         
  13.         
  14.      return name;   
  15.     }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章