zoukankan      html  css  js  c++  java
  • 第十三周安卓开发学习总结(1)

    写在前面

    最近事情多了起来,趁还有点闲工夫,学习了安卓四大组件的最后一个组件——ContentProvider,内容提供者。内容提供者的作用就是将自己的数据库暴露给别的APP,让别的APP可以操作。应用场景其实比较有限,所以之前没有学习。常见的应用场景有,微信提取联系人目录,各种商城APP自动添加提醒日程等等。大部分都是与系统的APP进行交互,从而实现一些比较方便的功能。比如刚截了一张屏QQ就会提示你有新图片要发,就是使用了ContentProvider来实现的。

    ContentProvider的基本使用

    要将自己的数据库暴露出去,首先要有一个数据库。使用Sqlite的方法这里就不再赘述了。建立好数据库后,设置内容提供者:

    public class UserProvider extends ContentProvider {
    
        private static final String TAG = "UserProvider";
        private UserDatabaseHelper mUserDatabaseHelper=null;
        private static final int USER_MATCH_CODE = 1;
        private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        static {
            sUriMatcher.addURI("com.androidlearing.contentpeovider","user",USER_MATCH_CODE);
        }
        @Override
        public boolean onCreate() {
            mUserDatabaseHelper = new UserDatabaseHelper(getContext());
            return false;
        }
    
        @Nullable
        @Override
        public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
            int result = sUriMatcher.match(uri);
            if(result==USER_MATCH_CODE){
                //匹配规则
                SQLiteDatabase db = mUserDatabaseHelper.getReadableDatabase();
                Cursor cursor = db.query(Constants.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
                return cursor;
            }else{
                //不匹配规则
                throw new IllegalArgumentException("参数错误");
            }
    
        }
    
        @Nullable
        @Override
        public String getType(@NonNull Uri uri) {
            return null;
        }
    
        @Nullable
        @Override
        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
            int result = sUriMatcher.match(uri);
            if(result==USER_MATCH_CODE){
                SQLiteDatabase db = mUserDatabaseHelper.getWritableDatabase();
                long id = db.insert(Constants.TABLE_NAME, null, values);
                Uri resultUri =Uri.parse("content://com.androidlearing.contentpeovider/user/"+id);
                Log.d(TAG,"insert user result -->"+id);
                //插入数据成功,数据已经变化,通知其他地方
                getContext().getContentResolver().notifyChange(resultUri,null);
                return resultUri;
            }else{
                throw new IllegalArgumentException("参数错误!");
            }
        }
    
        @Override
        public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
            return 0;
        }
    
        @Override
        public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
            return 0;
        }
    }
    

    这里只复写了query和insert方法,其他的方法也大致相同,就不再写了。
    四大组件都需要在配置文件中注册,内容提供者也是。我们注册一下:

     <provider
                android:exported="true"
                android:authorities="com.androidlearing.contentpeovider;userProvider"
                android:name=".provider.UserProvider"/>
    

    之后我们再写一个第三方应用来操作该应用的数据库,也就是ContentResolver:

    /**
         * 点击的时候我们去获取
         * @param v
         */
        public void getRemoteUsers(View v){
            ContentResolver contentResolver = getContentResolver();
            Uri uri = Uri.parse("content://com.androidlearing.contentpeovider");
            Cursor cursor = contentResolver.query(uri, null, "username = ?", new String[]{"fuck"}, null);
            String[] columnNames = cursor.getColumnNames();
            for(String columnName:columnNames){
                Log.d(TAG,"columnName -->"+columnName);
            }
            while(cursor.moveToNext()){
                for(String columnName: columnNames){
                    String value = cursor.getString(cursor.getColumnIndex(columnName));
                    Log.d(TAG,"=================");
                    Log.d(TAG,columnName+"======="+value);
                }
                Log.d(TAG,"=================");
            }
            cursor.close();
        }
    

    这里的uri里的路径要跟我们之前设置的一致。经过测试无误。

    总结

    内容提供者的基本内容就到这了。这周如果有时间会做几个案例试试,学习一下具体的使用场景。

  • 相关阅读:
    linux下拼接字符串的代码
    postgresql实现插入数据返回当前的主键ID
    记录一个linux下批处理的代码
    iptables
    mybatis获得执行insert的返回值
    git commit之后撤销
    仿照CIFAR-10数据集格式,制作自己的数据集
    C/C++ 在处理文件所在路径下创建子目录
    C/C++ 图像二进制存储与读取
    C/C++ 文件路径解析
  • 原文地址:https://www.cnblogs.com/wushenjiang/p/12872542.html
Copyright © 2011-2022 走看看