欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Android——ContentProvider

Android——ContentProvider

2025/2/22 2:03:53 来源:https://blog.csdn.net/weixin_45932565/article/details/142501711  浏览:    关键词:Android——ContentProvider

概述

  • ContentProvider为App存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据。
  • ContentProvider只是服务端App存取数据的抽象类,我们需要在其基础上实现一个完整 的内容提供器,并重写下列方法:

onCreate:创建数据库并获得数据库连接。
insert:插入数据。
delete:删除数据。
update:更新数据。
query:查询数据,并返回结果集的游标。
getType:获取内容提供器支持的数据类型。

  • Uri(通用资源标识符),代表数据操作的地址,每一个Cont entProvider 都会有唯一的地址。ContentProvider 使用的Uri 语法结构如下:

content://authority/data_path/id
[content://]:是通用前缀,表示该Uri用于ContentProvider定位资源。
[authority]:是授权者名称,用来确定具体由哪一个ContentProvider提供资源。因此 一般authority都由 类的小写全称组成,以保证唯一性。
[data_path]:是数据路径,用来确定请求的是哪个数据集。
[id]:是数据编号,用来请求单条数据。如果是多条这个字段忽略。

  • 利用ContentProvider只实现服务端App的数据封装,如果客户端App想访问对方的内部数据,就要通过内容解析器ContentResolver访问。

Serve 内容提供者

案例代码

package com.example.cpserve.provider;import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;import com.example.cpserve.database.UserDBHelper;public class MyContentProvider extends ContentProvider {private UserDBHelper dbHelper;@Overridepublic boolean onCreate() {dbHelper = UserDBHelper.getInstance(getContext());Log.d("MyContentProvider", "onCREATE");return false;}// content://com.example.cpserve.provider.MyContentProvider/user@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.insert(UserDBHelper.TABLE_NAME, null, values);return uri;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase db = dbHelper.getReadableDatabase();return db.query(UserDBHelper.TABLE_NAME, projection, selection, selectionArgs, sortOrder, null, null, null);}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic 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");}@Overridepublic 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 访问者

案例代码

package com.example.cpclient;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class ContentWriteActivity extends AppCompatActivity {private TextView tv_content;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_content_write);tv_content = findViewById(R.id.tv_content);findViewById(R.id.btn_save).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ContentValues values = new ContentValues();// cpserve里的MyContentProvider在创建表时只写了一个name字段values.put("name", "张三");getContentResolver().insert(UserInfoContent.CONTENT_URI, values);}});findViewById(R.id.btn_read).setOnClickListener(new View.OnClickListener() {@SuppressLint("Range")@Overridepublic void onClick(View view) {Cursor cursor = getContentResolver().query(UserInfoContent.CONTENT_URI, null, null, null, null, null);if (cursor != null) {StringBuilder sb = new StringBuilder();while (cursor.moveToNext()) {sb.append(cursor.getString(cursor.getColumnIndex("name")));}tv_content.setText(sb);}}});}
}

在访问者(Client)的AndroidManifest.xml里需要加入如下代码

    <!-- 出于安全考虑,Android11要求应用事先说明需要访问的其他软件包 --><queries><!-- 第一种写法 --><!-- <package android:name="com.example.cpserve"/>--><!-- 第二种写法 --><provider android:authorities="com.example.cpserve.provider.MyContentProvider"/></queries>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词