ContentProvider共享数据学习笔记(二)

下面介绍如何使用content provider去获取另一个应用的数据,例如App2要读取App1的数据。

1. App1先自定义一个provider。

public class MyProvider1 extends ContentProvider {

    private final static int CODE_NOPARAM = 1;

    private final static int CODE_PARAM = 2;

    private MyDBHelp dbHelp;

    private ContentResolver contentResolver;

    private final static String AUTHORITY = "com.kv.app1.MyProvider1";

    private final static String TABLE_INFO = "info";

    private final static String DB_NAME = "app1.db";


    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static {
        uriMatcher.addURI(AUTHORITY, "info", CODE_NOPARAM);
        uriMatcher.addURI(AUTHORITY, "info/#", CODE_PARAM);
    }

    @Override
    public boolean onCreate() {
        Context context = getContext();
        contentResolver = context.getContentResolver();
        dbHelp = new MyDBHelp(context, DB_NAME, null, 1);
        return true;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = dbHelp.getWritableDatabase();
        switch (uriMatcher.match(uri)) {
            case CODE_NOPARAM:
                long d = db.insert(TABLE_INFO, "_id", values);
                Uri u = ContentUris.withAppendedId(uri, d);
                contentResolver.notifyChange(u, null);
                return u;
            default:
                throw new IllegalArgumentException("this is unkown uri:" + uri);
        }
    }


    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelp.getWritableDatabase();
        switch (uriMatcher.match(uri)) {
            case CODE_NOPARAM:
                return db.delete(TABLE_INFO, selection, selectionArgs); // 删除所有记录
            case CODE_PARAM:
                long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
                String where = "_id = " + id;
                if (!TextUtils.isEmpty(selection)) {
                    where += " and " + selection;
                }
                return db.delete(TABLE_INFO, where, selectionArgs);
            default:
                throw new IllegalArgumentException("this is unkown uri:" + uri);
        }
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelp.getWritableDatabase();
        switch (uriMatcher.match(uri)) {
            case CODE_NOPARAM:
                return db.update(TABLE_INFO, values, selection, selectionArgs); // 更新所有记录
            case CODE_PARAM:
                long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
                String where = "_id = " + id;
                if (!TextUtils.isEmpty(selection)) {
                    where += " and " + selection;
                }
                return db.update(TABLE_INFO, values, where, selectionArgs);
            default:
                throw new IllegalArgumentException("this is unkown uri:" + uri);
        }
    }

    /**
     * 返回对应的内容类型
     * 如果返回集合的内容类型,必须以vnd.android.cursor.dir开头
     * 如果是单个元素,必须以vnd.android.cursor.item开头
     */
    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
            case CODE_NOPARAM:
                return "vnd.android.cursor.dir/info";
            case CODE_PARAM:
                return "vnd.android.cursor.item/info";
            default:
                throw new IllegalArgumentException("this is unkown uri:" + uri);
        }
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelp.getReadableDatabase();
        switch (uriMatcher.match(uri)) {
            case CODE_NOPARAM:
                return db.query(TABLE_INFO, projection, selection, selectionArgs, null, null, sortOrder);
            case CODE_PARAM:
                long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
                String where = "_id = " + id;
                if (!TextUtils.isEmpty(selection)) {
                    where += " and " + selection;
                }
                return db.query(TABLE_INFO, projection, where, selectionArgs, null, null, sortOrder);
            default:
                throw new IllegalArgumentException("this is unkown uri:" + uri);
        }
    }

    private static class MyDBHelp extends SQLiteOpenHelper {

        public MyDBHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);

        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String sql = "create table info(_id integer primary key autoincrement," +
                    "name text not null, number text not null);";
            db.execSQL(sql);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onCreate(db);

        }
    }
}

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kv.app1">

    <application android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
        <activity android:name=".App1Act1">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <provider
            android:name="com.kv.app1.MyProvider1"
            android:authorities="com.kv.app1.MyProvider1" android:exported="true" />
    </application>
</manifest>

2.app2获取的代码

public class App2Act1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act1);
        final TextView tv = (TextView) findViewById(R.id.tv);

        final ContentResolver contentResolver = getContentResolver();

        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues cv = new ContentValues();
                cv.put("name", "kevin");
                cv.put("number", "30");
                Uri uri  = contentResolver.insert(Uri.parse("content://com.kv.app1.MyProvider1/info"), cv);
                tv.setText("uri=" + uri.toString());
            }
        });

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String selection = "name=?";
                String[] selectionArgs = new String[]{"kevin"};
                Cursor cursor = contentResolver.query(Uri.parse("content://com.kv.app1.MyProvider1/info"), null, selection, selectionArgs, null);
                if (cursor != null) {
                    StringBuilder sb = new StringBuilder();
                    while (cursor.moveToNext()) {
                        sb.append(cursor.getInt(0) + " " + cursor.getString(1) + " " + cursor.getString(2) + "\n");
                    }
                    tv.setText(sb.toString());
                    cursor.close();
                }
            }
        });

        findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = contentResolver.delete(Uri.parse("content://com.kv.app1.MyProvider1/info/3"), null, null);
                tv.setText("id=" + id);

            }
        });



    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值