Android 开发(内容提供者)_ContentProvider

举报
在下皮德狠 发表于 2022/11/08 13:42:20 2022/11/08
【摘要】 ContentProviderContentProvider为App存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据。ContentProvider只允许访问者获取提供者允许获取的内容,并提供接口ContentProvider 在应用之间共享数据Client App 将用户的输入内容,通过ContentProvider跨进程通信传递给Server App。首先创建两个Module...

ContentProvider

  • ContentProvider为App存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据。
  • ContentProvider只允许访问者获取提供者允许获取的内容,并提供接口

ContentProvider 在应用之间共享数据

  • Client App 将用户的输入内容,通过ContentProvider跨进程通信传递给Server App。

首先创建两个Module:  serverModule   ClientModule

server端代码编写           在serverModule中   右击   ->   New   ->    Other  ->    ContentProvider

URI Authorities  先随意自定义一个  稍后进行修改

我这里定义的是  xxx

然后到清单文件里查看,会有下面一段代码

可以看到authorities里的内容为xxx,我们修改里面的内容在里面写上它的完整类名  即  包名+类名  直接把自己的包名和类名粘贴上去即可

包名

类名

得到

然后创建一个类,继承于SQLiteOppoHelper,得到一个数据库

public class SQLiteUser extends SQLiteOpenHelper {

    //数据库名字
    private static final String SQL_NAME = "user.db";
    //数据库版本
    private static final int SQL_VERSION = 1;
    //帮助器初始化为空
    private static SQLiteUser mUserHelper = null;
    //数据表名字
    public static final String DB_NAME = "user_info";

    //子类继承父类方法,context上下文,数据库名字,游标工厂,数据库版本号
    private SQLiteUser(Context context) {
        super(context, SQL_NAME, null, SQL_VERSION);
    }

    //用单例模式获取一个数据库帮助器
    public static SQLiteUser getInstance(Context context) {
        if (mUserHelper == null) {
            mUserHelper = new SQLiteUser(context);
        }
        return mUserHelper;
    }

    //创建数据库方法
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        String sql =    "CREATE TABLE IF NOT Exists "+DB_NAME+"(" +
                        " _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
                        " phone VARCHAR NOT NULL," +
                        " password VARCHAR NOT NULL);";
                         sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}
  • 了解一下Uri

Uri(通用资源标识符 Universal Resource Identifer),代表数据操作的地址,每一个ContentProvider 都会有唯一的地址。

ContenProvider 使用的Uri语法结构如下:

content://authority/data_path/id

content  是通用的前缀,表示该Uri用于ContentProvider定位资源

authority  是授权者的名称,用来确定具体由哪一个ContentProvider提供资源。因此一般authority  都由类的小写全称组成,以保证唯一性。

data_path  是数据指定路径,用来确定请求的是哪个数据集

id  是数据编号,用来请求单挑数据,如果是多条这个字段忽略

然后回到我们创建的这个类

public class UserInfoContentProvider extends ContentProvider {

    private SQLiteUser mSQL;

    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

    private static final int USERS = 1;
    private static final int USER = 2;

    static {
        //往uri匹配器中添加指定的数据路径
        URI_MATCHER.addURI(UserInfoContent.AUTHORITIES,"/user",USERS);
        URI_MATCHER.addURI(UserInfoContent.AUTHORITIES,"/user/#",USER);

    }

    private int count;

    @Override
    public boolean onCreate() {
        mSQL = SQLiteUser.getInstance(getContext());
        return true;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
       if (URI_MATCHER.match(uri) == USERS){
           SQLiteDatabase database = mSQL.getWritableDatabase();
           database.insert(SQLiteUser.DB_NAME,null,values);
       }
        return uri;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        if (URI_MATCHER.match(uri) == USERS){
            SQLiteDatabase readableDatabase = mSQL.getReadableDatabase();
            return readableDatabase.query(SQLiteUser.DB_NAME, projection, selection, selectionArgs, null, null, null);
        }
        return  null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int count = 0;
        switch (URI_MATCHER.match(uri)){
        //com.example.chapter_06_server.provider.UserInfoContentProvider/user  删除多行
            case USERS:
                SQLiteDatabase database = mSQL.getWritableDatabase();
                count = database.delete(SQLiteUser.DB_NAME,selection,selectionArgs);
                database.close();
                break;
            //com.example.chapter_06_server.provider.UserInfoContentProvider/user/2  删除单行
            case USER:
                String id = uri.getLastPathSegment();
                SQLiteDatabase database1 = mSQL.getWritableDatabase();
                database1.delete(SQLiteUser.DB_NAME,"_id=?",new String[]{id});
                database1.close();
                break;
        }
            return count;
    }

    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        throw new UnsupportedOperationException("Not yet implemented");
    }


    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO: Implement this to handle requests to update one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

Client 端代码编写    

首先创建一个Activity   

界面展示

先创建一个类里面写好Uri这样就不用每次都写,代码就不会写的很长

public class UserInfoContent {

    public static final String AUTHORITIES = "com.example.chapter_06_server.provider.UserInfoContentProvider";

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");

}

Activity 代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_main);

        et_id = findViewById(R.id.et_id);
        et_phone = findViewById(R.id.et_phone);
        et_password = findViewById(R.id.et_password);
        btn_save = findViewById(R.id.btn_save);
        btn_delete = findViewById(R.id.btn_delete);
        btn_update = findViewById(R.id.btn_update);
        btn_query = findViewById(R.id.btn_query);

        btn_save.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_save:
                ContentValues values = new ContentValues();
                values.put("phone", String.valueOf(et_phone.getText()));
                values.put("password", String.valueOf(et_password.getText()));
                getContentResolver().insert(UserInfoContent.CONTENT_URI, values);
                Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
                break;

            case R.id.btn_query:
                Cursor cursor = getContentResolver().query(UserInfoContent.CONTENT_URI, null, null, null, null);
                if (cursor != null) {
                    while (cursor.moveToNext()) {
                        UserInfo info = new UserInfo();
                        info.id = cursor.getString(0);
                        info.phone = cursor.getString(1);
                        info.password = cursor.getString(2);
                        Log.d("TAG", info.toString());
                    }
                    cursor.close();
                }
                break;
            case R.id.btn_delete:
                //删除单行  传参id传一个想删除信息的那一条id
//                Uri uri = ContentUris.withAppendedId(UserInfoContent.CONTENT_URI,1);
//                int count = getContentResolver().delete(uri,null,null);

                //删除指定phone 的那一条信息
                int count = getContentResolver().delete(UserInfoContent.CONTENT_URI, "phone=?", new String[]{String.valueOf("18470726888")});
                if (count > 0) {
                    Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。