9日目のContentProviderのコンテンツプロバイダ
A:ContentProviderの
.ContentProvider紹介:
第二回路図
第三に、携帯電話の連絡先を取得し、リストビューに表示すると、データベースに保存されている
。SMSを取得する3
カスタムコンテンツプロバイダ:B
何。カスタムコンテンツプロバイダは、ある
2つのアイデア
3つのプロバイダーコード:my_contentprovider moudle作成し
たコードの内容を要求する4つの党が。
:ContentProviderの
.ContentProviderの説明:
1.ContentProviderコンテンツプロバイダー(4つの要素の1)は、主に使用されています異なるアプリケーション間でのデータ共有機能。
2.スキルポイントを得る:
(1)システムへのアクセスは、コンテンツプロバイダが付属しています(******)
携帯電話の連絡先/オーディオ/ビデオ/ギャラリー/ SMS /システム設定は、
(2)コンテンツプロバイダ書くこと
3.注意を:
II。概略
III。リストビューに表示され、データベースに格納するために、携帯電話の連絡先を取得します
(1)許可を得るために携帯電話の連絡先を追加
<uses-permission android:name="android.permission.READ_CONTACTS" />
1
(2)获得手机联系人,展现在ListView中 并将信息存储到数据库中
uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
字段:ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME:姓名
ContactsContract.CommonDataKinds.Phone.NUMBER:电话
//获取手机联系人
public void click1(View view) {
//TODO 1:获得ContentResolver
ContentResolver resolver = getContentResolver();
//TODO 2:确定uri和要查询的字段
Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] strs={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};
//TODO 3:执行查询并将结果遍历展现在ListView中和存储到本地的数据库中
Cursor cursor=resolver.query(uri,strs,null,null,null);
ArrayList<Phone> list=new ArrayList<>();
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
list.add(new Phone(name,number));
//将每条记录存储到自己的数据库中
}
//将list集合中的数据展现在ListView中,此处省略
}
class Phone{
private String name;
private String number;
public Phone(String name, String number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
IIIは。SMSを取得します
(1)追加SMSに許可を得ます
//メッセージを取得します
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void click2(View view) {
ContentResolver resolver = getContentResolver();
Uri uri= Telephony.Sms.CONTENT_URI;
String[] strs={Telephony.Sms.BODY,Telephony.Sms.ADDRESS};
Cursor cursor=resolver.query(uri,strs,null,null,null);
//第一种ListView 中 第二种 :存到数据库
ArrayList<Msm> list=new ArrayList<>();
while(cursor.moveToNext()){
String address=cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
String body=cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
list.add(new Msm(address,body));
//执行insert语句
}
}
class Msm{
private String address;
private String body;
public Msm(String address, String body) {
this.address = address;
this.body = body;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
B:ここで説明した挿入画像でカスタムコンテンツプロバイダ
。カスタムコンテンツプロバイダがある何が
、私たちが考えなければならないと私たちは携帯電話の連絡先を取得する前に、プロバイダはシステム自体APPは、プロバイダ側に尋ねるコンテンツプロバイダになります、私達を要求する当事者は、今、私たちは、その後、我々はカスタムコンテンツプロバイダを必要とする、私達のデータベースを訪問するプロバイダ、他人をしたいです。
二つのアイデア:
1.プロバイダ:ContentProviderの
(1)データベース、SQLiteOpenHelper継承するカスタムクラスを作成
/更新/ queryメソッド、外の世界に方法を挿入/削除を書き換え、(2)カスタムコンテンツプロバイダクラス、継承のContentProviderを
(コンテンツプロバイダに登録文書3)リスト
当事者が要求2:ContentResolverのは、
(1)の物体ContentResolverのgetContentResolver法コンテキストによって得られた
URIを決定するために、(2)
(3)コールの挿入/削除/更新/データベースアクセス方法を問い合わせます
3つのプロバイダーコード:Moudleはmy_contentproviderを作成
SQLiteOpenHelperを継承しています(1)カスタムクラス
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "user.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user (_id integer primary key autoincrement ,name varchar(30),age integer)");
for(int i=1;i<10;i++){
db.execSQL("insert into user values(null,?,?)",new String[]{"总定型"+i+"",i+""});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
(2)カスタムコンテンツプロバイダクラス、継承のContentProvider
public class MyProvider extends ContentProvider {
private MyHelper myHelper;
private SQLiteDatabase db;
//获取数据库
@Override
public boolean onCreate() {
myHelper=new MyHelper(getContext());
db=myHelper.getWritableDatabase();
if(db==null){
return false;
}else{
return true;
}
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return db.query("user",projection,selection,selectionArgs,null,null,sortOrder);
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
db.insert("user",null,values);
return uri;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return db.delete("user",selection,selectionArgs);
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return db.update("user",values,selection,selectionArgs);
}
}
(3)コンテンツプロバイダに登録した文書のリストを
<provider
android:exported="true"
android:authorities="com.bawei"
android:name=".MyProvider"></provider>
注:マニフェストファイルは、URIの当局の要求者の財産です。com.bawei
コードの内容を要求するIV。党は、
(1)直接アクセスContentResolverの取得します
OKウリ:conten:フロント//com.baweiはcontenを追加する必要があります://
パブリッククラスMainActivityはAppCompatActivity {拡張
プライベートContentResolverのContentResolverのを。
プライベートウリのURI。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uri=Uri.parse("content://com.bawei");
contentResolver=getContentResolver();
}
//user (_id integer primary key autoincrement ,name varchar(30),age integer)
public void query(){
//参数一:uri 参数二:查询的字段 参数三:条件 参数四:为?赋值 参数五:排序
Cursor cursor=contentResolver.query(uri,new String[]{"_id","name"},null,null,null);
//遍历
}
public void delete(){
//参数一:uri 参数二:条件 参数三:为?赋值
int raw=contentResolver.delete(uri,"name=?",new String[]{"要甜雪"});
}
public void insert(){
//添加数据
ContentValues contentValues=new ContentValues();
contentValues.put("name","要甜雪");
contentValues.put("age",18);
contentResolver.insert(uri,contentValues);
//遍历
}