一、介绍
Content Provider是 Android 四大组件之一,主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。
不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。
二、实验
1.用作Provider的app
主要作用:定义一个数据库,提供数据
主要文件:
MySqlite.java
package com.example.sqlitetest;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
public class MySqlite {
private Context context;
private SQLiteDatabase database;
public MySqlite(Context context){
this.context=context;
MyDatabase dbhelper=new MyDatabase(context,"db",null,1);
database=dbhelper.getWritableDatabase();
}
public Uri Daoinsert(ContentValues contentValues){
long rowid=database.insert("student",null,contentValues);
Uri uri=Uri.parse("content://com.example.provider.MyContentProvider/student");
Uri inserturi= ContentUris.withAppendedId(uri,rowid);
context.getContentResolver().notifyChange(inserturi,null);
return inserturi;
}
public Cursor query(String[] whichone, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor1 = database.query("student",whichone,selection,selectionArgs,
null,null,sortOrder);
return cursor1;
}
}
Mydatabase.java
package com.example.sqlitetest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class MyDatabase extends SQLiteOpenHelper {
public MyDatabase(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table student ("+"id integer primary key autoincrement,name varchar,age integer)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
MyContentProvider.java
package com.example.sqlitetest;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyContentProvider extends ContentProvider {
private MySqlite MySqlite;
public MyContentProvider(){
}
@Override
public boolean onCreate() {
MySqlite=new MySqlite(this.getContext());
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
return MySqlite.query(strings,s,strings1,s1);
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return "1";
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
getContext().getContentResolver().insert(uri,contentValues);
return MySqlite.Daoinsert(contentValues);
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
return 0;
}
}
2.用作Resovler的app
主要作用:接收其他app的数据并输出
主要文件:
package com.example.providertest;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private String d="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button_resovel);
TextView textView=findViewById(R.id.textView_resovel);
ContentResolver resolver = getContentResolver();
ContentValues values= new ContentValues();
values.put("name","sb");
values.put("age","20");
Uri uri = Uri.parse("content://com.example.sqlitetest.MyContentProvider/student");
// button.setOnClickListener(v -> resolver.insert(uri,values));
button.setOnClickListener(v -> {
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
@SuppressLint("Range") String name = cursor.getString(cursor.
getColumnIndex("name"));
@SuppressLint("Range") int age = cursor.getInt(cursor.
getColumnIndex("age"));
@SuppressLint("Range") int id = cursor.getInt(cursor.
getColumnIndex("id"));
d += ("id=" + id + " name=" + name + " age=" + age);
}
textView.setText(d);
}
);
}
}
三、结果
先运行数据库插入数据
然后运行作为Resovler的app
执行结果
截图演示: