Android 开发(内容提供者)_ContentProvider
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;
}
}
}
- 点赞
- 收藏
- 关注作者
评论(0)