关于Provider用法小总结了一下

1.新建一个数据库帮助类MyDBHelper

//创建数据库szt
public class MyDBHelper extends SQLiteOpenHelper {

 public MyDBHelper(Context context) { 
  super(context, "szt.db", null, 1); 
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  // 创建一个数据表Users
  db.execSQL("create table Users(_id integer primary key autoincrement,name text)");
 }
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  
  
 }

}

2.新建一个类MyProvide继承ContentProvider,并复写四个方法,四个方法实现了对数据库的操作,并且可以通过uri匹配器,匹配uri的格式,
  从而改变数据,通过this.getContext().getContentResolver().notifyChange(uri, null);这个方法,在改变数据时,向使用此共享参数的第三方发通知,通知数据已改变。

  
继承ContentProvider的类需要注册  <provider android:name=".MyProvide" android:authorities="
www.android1.com.cn"></provider>
  内容提供者和数据库绑定,其它程序不可记问本程序的数据库,但可以通过内容提代者访问数据库。

public class MyProvide extends ContentProvider {
 SQLiteDatabase db = null;
     //uri内容匹配器,如果有与usi相匹配的matcher返回1,不匹配返回-1;
 private static UriMatcher  matcher=new UriMatcher(UriMatcher.NO_MATCH);
 private static final int aa=1;//定义两个常量,代表不同的两个uri值
 private static final  int bb=2;
 static {
  //添加匹配类型#表示任意数字
  matcher.addURI("www.android1.com.cn", "Users", aa);
  matcher.addURI("www.android1.com.cn", "Users/#", bb);
 }
 @Override
 public boolean onCreate() {
  // 实例化数据库,在执行此方法时,获得可读写数据库对象db,通过继承Contentprovider类后,复写的四个操作数据库的方法来改变数据库
  MyDBHelper helper = new MyDBHelper(this.getContext());
  db = helper.getWritableDatabase();
  return true;
 }

 @Override
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
  long id;
  switch(matcher.match(uri)){
  case aa:
   // 查询数据库,返回一个游标值。
   return db.query("Users", projection, selection, selectionArgs, null,null, sortOrder);

  case bb:
  id=ContentUris.parseId(uri);//截取Uri最后一个数字,返回一个long型 
  String selections=null;
  selections="_id="+id;
  if(selection!=null&&"".equals(selection)){
   selections+="and"+selection;
  }
  return db.query("Users", projection, selections, selectionArgs, null,null, sortOrder);
  
  default:
   throw new IllegalArgumentException("Uri:  "+uri);
  }
 }

 
 @Override
 public Uri insert(Uri uri, ContentValues values) {
 
  //matcher.match(uri)有两种返回值,匹配成功的返回值是1,当正好与aa的值相等时
  switch(matcher.match(uri)){
  case  aa:
   //当执行方法()时,通知其它用户我的数据已经改变了,用在多个程序同时访问本数据库时。
   this.getContext().getContentResolver().notifyChange(uri, null);//
   db.insert("Users", "_id", values); 
   break;
  default:
   throw new IllegalArgumentException("Uri:  "+uri);
  }
  return uri;
 }

 @Override
 public int delete(Uri uri, String selection, String[] selectionArgs) {
  int i;
  long id;
  switch(matcher.match(uri)){
  case aa:
   this.getContext().getContentResolver().notifyChange(uri, null);//
   i=db.delete("Users", selection, selectionArgs);
   return i;
  case bb:
   this.getContext().getContentResolver().notifyChange(uri, null);//
   id=ContentUris.parseId(uri);//截取Uri最后一个数字,返回一个long型 
   String selections=null;
   selections="_id="+id;
   if(selection!=null&&"".equals(selection)){
    selections+="and"+selection;
   }
   i=db.delete("Users", selections, selectionArgs);
   return i;
   default:
    throw new IllegalArgumentException("Uri:  "+uri); 
  }
  
//  return db.delete("Users", selection, selectionArgs);
 }

 @Override
 public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
//  int s = db.update("Users", values, selection, selectionArgs);
//  return s;
  
  int u=0;
  long uid;
  switch(matcher.match(uri)){
  //更新所有的数据
  case aa:
   this.getContext().getContentResolver().notifyChange(uri, null);//
   u=db.update("Users", values, selection, selectionArgs);
   return u;
   //更新数据id为Uid值的那条数据 
  case bb:
   this.getContext().getContentResolver().notifyChange(uri, null);//
   uid=ContentUris.parseId(uri);
   String selections=null;
   selections="_id="+uid;
   if(selection!=null&&"".equals(selection)){
    selections+="and"+selection;
   }
   u=db.update("Users", values, selections, selectionArgs);
   return u;
  default:
   throw new IllegalArgumentException("Uri:  "+uri);
  }
  
  
 }

 @Override
 public String getType(Uri uri) {
  return null;
 }

}


3.建一个第三方程序,接收数据的改变,需要另建一个项目
/**第三方程序,当第三方程序用来监听数据库的改变(当往数据中更新数据时会给第三方发通知)this.getContext().getContentResolver().notifyChange(uri, null);
  * public class MainActivity extends Activity {
 ListView list;
 SimpleCursorAdapter adapter ;
 Cursor c ;
 ContentResolver resolver;
 Uri uri;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  list = new ListView(this);
  setContentView(list);
  resolver = this.getContentResolver();//获得一个解析器
  uri = Uri.parse("content://www.android1.com.cn/Users");//获得一个uri
  //通过解析器,监听数据库改变时返回来的数据,下面第三个参数代表运行一个类,这个类返回了数据改变后的数据。
  resolver.registerContentObserver(uri, true, new MyContentObserver(new Handler()));
  
  c = resolver.query(uri, null, null, null, null);查询出数据库中所有信息,返回一个游标,利用游标适配器,将数据加到listview上。
  adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, c, new String[]{"name"}, new int[]{android.R.id.text1});
  list.setAdapter(adapter);
  
 }
 此类返回数据的改变
 class MyContentObserver extends ContentObserver{

  public MyContentObserver(Handler handler) {
   super(handler);
   
  }
  @Override
  public void onChange(boolean selfChange) {
   super.onChange(selfChange);
   Toast.makeText(MainActivity.this, "Change", 1).show();//数据改变后,重新查询数据库,重新加载适配器
   c = resolver.query(uri, null, null, null, null);
   adapter = new SimpleCursorAdapter(MainActivity.this, android.R.layout.simple_list_item_1, c, new String[]{"name"}, new int[]{android.R.id.text1});
   list.setAdapter(adapter);
  }
  
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}
  *

4.测试数据库的增删改查功能,测试类如何写,需要另建一个测试项目

/**测试其它应用程序的数据
 *     首先知道其它程序的共享参数,这个是继承ContentProvider共享参数类的注册格式:
 *  <provider android:name=".MyProvide" android:authorities="www.android1.com.cn"></provider>
 * 1.TestMyProvide测试类首先在资源文件中添加权限在Instrumentation-->add---->name--->android.test.InstrumentationTestRunner  
 *                                                                     ---->Target package--->com.example.testprovider 包名
 * 2. 注册测试资源文件
 *   <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.testprovider.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <uses-library android:name="android.test.runner"/>//加入这个固定格式
    </application>                                             
 *
 *3.注册完后,本类,继承AndroidTestCase类,重写测试数据库的方法,方法名以test开头的。
 * 在outline模式下,出现TestMyProvide类下的五个方法setUp();
 *    testInsert();
 *    testQuery();
 *    testdelete();
 *    testUpdate();
 *    选中一个方法,点击右键--->Run As--->Android jUnit Test运行方法
 *    在MyProvide类下,在data--date--包名--导出数据库后,查看数据库
 */
public class TestMyProvide extends AndroidTestCase {
 ContentResolver resolver = null;
 @Override
 protected void setUp() throws Exception {
  resolver  = this.getContext().getContentResolver();
  super.setUp();
 }
 
 public void testInsert(){
  ContentValues values = new ContentValues();
  values.put("name", "ken");
  resolver.insert(Uri.parse("content://www.android1.com.cn//Users"), values);
  Log.i("msg", "wangcua");
 }
 public void testQuery(){
  Cursor c = resolver.query(Uri.parse("content://www.android1.com.cn"), null, null, null, null);
  while(c.moveToNext()){
   Log.i("msg", c.getString(c.getColumnIndex("name")));
  }
  c.close();
 }
 public void testdelete(){
  resolver.delete(Uri.parse("content://www.android1.com.cn/Users"), "_id = ?", new String[]{String.valueOf(11)});
 }
 public void testUpdate(){
  ContentValues values = new ContentValues();
  values.put("name", "haohao");
  resolver.update(Uri.parse("content://www.android1.com.cn"), values, "_id = ?", new String[]{String.valueOf(3)});
 }
 
}

 


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值