zoukankan      html  css  js  c++  java
  • android ContentProvider

       内容提供者对外提供共享数据,需要在清单文件中进行配置,必须在应用的包或者子包下。

    ContentProvider类

    public class PersonProvider extends ContentProvider //必须继承ContentProvider类
    {
    private DBOpenHelper dbOpenHelper; private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final int PERSONS = 1; private static final int PERSON = 2; static{ MATCHER.addURI("cn.itcast.providers.personprovider", "person", PERSONS); MATCHER.addURI("cn.itcast.providers.personprovider", "person/#", PERSON); } @Override public boolean onCreate() { dbOpenHelper = new DBOpenHelper(this.getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); switch (MATCHER.match(uri)) { case PERSONS: return db.query("person", projection, selection, selectionArgs, null, null, sortOrder); case PERSON: long rowid = ContentUris.parseId(uri); String where = "personid="+ rowid; if(selection!=null && !"".equals(selection.trim())){ where += " and "+ selection; } return db.query("person", projection, where, selectionArgs, null, null, sortOrder); default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } } @Override public String getType(Uri uri) { switch (MATCHER.match(uri)) { case PERSONS: return "vnd.android.cursor.dir/person"; case PERSON: return "vnd.android.cursor.item/person"; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); switch (MATCHER.match(uri)) { case PERSONS: long rowid = db.insert("person", "name", values);//主键值 // content://cn.itcast.provides.personprovider/person/10 Uri insertUri = ContentUris.withAppendedId(uri, rowid); this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知 return insertUri; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int num = 0; switch (MATCHER.match(uri)) { case PERSONS: num = db.delete("person", selection, selectionArgs); break; case PERSON: long rowid = ContentUris.parseId(uri); String where = "personid="+ rowid; if(selection!=null && !"".equals(selection.trim())){ where += " and "+ selection; } num = db.delete("person", where, selectionArgs); break; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } return num; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int num = 0; switch (MATCHER.match(uri)) { case PERSONS: num = db.update("person", values, selection, selectionArgs); break; case PERSON: long rowid = ContentUris.parseId(uri); String where = "personid="+ rowid; if(selection!=null && !"".equals(selection.trim())){ where += " and "+ selection; } num = db.update("person", values, where, selectionArgs); break; default: throw new IllegalArgumentException("this is Unknown Uri:"+ uri); } return num; } }

    清单文件配置:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="cn.itcast.db"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".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" />
    
            <provider android:name=".PersonProvider" android:authorities="cn.itcast.providers.personprovider"/>
        </application>
        <uses-sdk android:minSdkVersion="8" />
    
    <instrumentation android:name="android.test.InstrumentationTestRunner"
      android:targetPackage="cn.itcast.db" android:label="Tests for My App" />
      
    </manifest> 

    对内容提供者的使用:

    public class AccessContentProviderTest extends AndroidTestCase {
        private static final String TAG = "AccessContentProviderTest";
        
        public void testInsert() throws Exception{                                       
            Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person");
            ContentResolver resolver = this.getContext().getContentResolver();
            ContentValues values = new ContentValues();
            values.put("name", "laoli");
            values.put("phone", "1860103838383");
            values.put("amount", "50000000000");
            resolver.insert(uri, values);
        }
        
        public void testDelete() throws Exception{
            Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person/20");
            ContentResolver resolver = this.getContext().getContentResolver();
            resolver.delete(uri, null, null);
        }
        
        public void testUpdate() throws Exception{
            Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person/1");
            ContentResolver resolver = this.getContext().getContentResolver();
            ContentValues values = new ContentValues();
            values.put("name", "zhangxiaoxiao");
            resolver.update(uri, values, null, null);
        }
        
        public void testQuery() throws Exception{
            Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person");
            ContentResolver resolver = this.getContext().getContentResolver();
            Cursor cursor = resolver.query(uri, null, null, null, "personid asc");
            while(cursor.moveToNext()){
                String name = cursor.getString(cursor.getColumnIndex("name"));
                Log.i(TAG, name);
            }
            cursor.close();
        }
    }

     监听内容提供者的数据的变化:

    1、打开数据变化的通知:

    2、注册数据变化监听

     内容提供者中多个操作在同一个事物中执行:

  • 相关阅读:
    HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported
    【MySQL用法】Mysql数据库连接池 [ druid ] 的所有配置介绍
    冒泡排序
    com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20
    判断两个线段是否相交02
    判断两个线段是否相交
    unity小地图制作___按比例尺图标布局
    Unity---Inspector面板自定义
    unity物理检测的几种方式
    unity音量设置(同时设置到多个物体上)——引伸语言设置
  • 原文地址:https://www.cnblogs.com/heml/p/3510466.html
Copyright © 2011-2022 走看看