Android 自定义ContentProvider

来源:互联网 发布:cf手游三头龙挂机软件 编辑:程序博客网 时间:2024/05/11 13:41

另外一份类似的文章但是更详细的  http://codingnow.cn/android/1078.html


Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下。

要使用ContentProvider来操作数据,必须要有保存数据的场所。可以使用文件或SQLite数据库的方式来保存数据,通常使用SQLite数据库。

1,创建一个数据库帮助类,归根结底都是它在操作数据库。代码如下:

[plain] view plaincopy
  1. package com.njue;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class DBManager extends SQLiteOpenHelper {  
  9. public static final String myProvider_table_name="myProvider_table_name";  
  10. String sql="create table myProvider_table_name(id integer,name text)";  
  11.     public DBManager(Context context) {  
  12.         super(context, "myPrivoder.db", null, 1);  
  13.         // TODO Auto-generated constructor stub  
  14.     }  
  15.   
  16.     @Override  
  17.     public void onCreate(SQLiteDatabase arg0) {  
  18.         // TODO Auto-generated method stub  
  19.       arg0.execSQL(sql);  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  24.         // TODO Auto-generated method stub  
  25.   
  26.     }  
  27.   
  28. }  


2,创建一个myProvider类,该类继承ContentProvider,实现其抽象方法来操作数据库,该类引用DBManager类来获得数据库实例。

[plain] view plaincopy
  1. package com.njue;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentValues;  
  5. import android.database.Cursor;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7. import android.net.Uri;  
  8.   
  9. public class myProvider extends ContentProvider {  
  10.     DBManager dbHelper;  
  11.     @Override  
  12.     public int delete(Uri arg0, String arg1, String[] arg2) {  
  13.         // TODO Auto-generated method stub  
  14.         SQLiteDatabase db=dbHelper.getWritableDatabase();  
  15.         int id=db.delete(DBManager.myProvider_table_name, arg1, arg2);  
  16.         if(id!=0)return id;  
  17.         return 0;  
  18.     }  
  19.   
  20.     @Override  
  21.     public String getType(Uri uri) {  
  22.         // TODO Auto-generated method stub  
  23.         return null;  
  24.     }  
  25.   
  26.     @Override  
  27.     public Uri insert(Uri uri, ContentValues values) {  
  28.         // TODO Auto-generated method stub  
  29.         SQLiteDatabase db=dbHelper.getWritableDatabase();  
  30.         db.insert(DBManager.myProvider_table_name, "id", values);  
  31.         return null;  
  32.     }  
  33.   
  34.     @Override  
  35.     public boolean onCreate() {  
  36.         // TODO Auto-generated method stub  
  37.         dbHelper=new DBManager(getContext());  
  38.         return true;  
  39.     }  
  40.   
  41.     @Override  
  42.     public Cursor query(Uri uri, String[] projection, String selection,  
  43.             String[] selectionArgs, String sortOrder) {  
  44.         // TODO Auto-generated method stub  
  45.         SQLiteDatabase db=dbHelper.getWritableDatabase();  
  46.         Cursor c=db.query(DBManager.myProvider_table_name,projection, selection, selectionArgs, null, null, sortOrder);  
  47.         return c;  
  48.     }  
  49.   
  50.     @Override  
  51.     public int update(Uri uri, ContentValues values, String selection,  
  52.             String[] selectionArgs) {  
  53.         // TODO Auto-generated method stub  
  54.         SQLiteDatabase db=dbHelper.getWritableDatabase();  
  55.         int id=db.update(DBManager.myProvider_table_name, values, selection, selectionArgs);  
  56.         if(id!=0)return id;  
  57.         return 0;  
  58.     }  
  59.   
  60. }  


3,ContextProvider必须声明才能使用,因此,需要在AndroidManifest.xml配置文件中声明。声明很简单,需要类名称和授权名称两个属性。

[plain] view plaincopy
  1. <provider android:name="myProvider"  
  2.         android:authorities="com.njue.myProvider" />  


 

到这里,我们自定义的ContentProvider就完成了。我们可以在Eclipse中的File Explorer 窗口中看到自定义的ContentProvider

 

4,简单测试

 

[plain] view plaincopy
  1. package com.njue;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ContentResolver;  
  5. import android.content.ContentValues;  
  6. import android.database.Cursor;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.TextView;  
  14.   
  15. public class Content_providerActivity extends Activity {  
  16.     /** Called when the activity is first created. */  
  17.      Uri uri;  
  18.      String AUTHORITY="content://com.njue.myProvider/myProvider_table_name";  
  19.      ContentResolver cr;  
  20.      EditText input;  
  21.      Button insert;  
  22.      TextView show;  
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.        setContentView(R.layout.main);  
  27.        input=(EditText)findViewById(R.id.input);  
  28.        insert=(Button)findViewById(R.id.insert);  
  29.        show=(TextView)findViewById(R.id.show);  
  30.         uri=uri.parse(AUTHORITY);  
  31.         cr=this.getContentResolver();  
  32.         insert.setOnClickListener(new Button.OnClickListener(){  
  33.   
  34.             @Override  
  35.             public void onClick(View v) {  
  36.                 // TODO Auto-generated method stub  
  37.                  ContentValues values=new ContentValues();  
  38.                     values.put("name", input.getText().toString());  
  39.                     cr.insert(uri, values);  
  40.                     Cursor c=cr.query(uri, null, null, null, null);  
  41.                     show.setText("");  
  42.                     c.moveToFirst();  
  43.                     while(c.moveToNext()){  
  44.                      show.append(c.getString(1)+"\r\n");  
  45.                     }  
  46.                     input.setText("");  
  47.             }});  
  48.          
  49.     }  
  50. }  
0 0