内容提供者—Content Provider(一)

时间:2022-10-20 09:22:18

   今天我主要是复习了一下内容的提供者contentProvier,为什么就内容的提供者呢?因为它为数据源提供的统一接口,通过contentProvider可以把程序内部的数据向外部程序公开,这样其他程序就可以访问他们并可以对它们操作。那为什么Android SDK要提供contentProvider来访问数据呢?

       很多程序内部的数据库文件都保存在私有数据库中,一般常规方法很难访问这些数据库。通过ContentProvider可以访问到。这让我想起了java中的private 的用法,我们都知道private把变量或者方法类什么给保护起来了,变成私有的了,java中通常是用getter和setter方法对它们进行访问。contentProvider有些类似,数据库是私有的数据,而ContentProvider就相当于getter和setter方法。  

      程序内的数据库结构可能很复杂,通过Content Provider可以给程序人员提供一个更加人性化的操作方式,而这些复杂操作基本隐藏在增删改查方法中。

     由于安全考虑,contentProvider设置了一些权限,只要程序提供了相应的ContentProvider,就可以访问了。

读取联系人信息

package com.example.contactcontentprovider_01;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity {

private ListView listView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1,
cursor, new String[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts.DISPLAY_NAME_ALTERNATIVE},
new int[]{android.R.id.text1});
listView.setAdapter(adapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

接收SMS短信

package com.example.smscontentprovider_01;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView)findViewById(R.id.listView);
Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, "address like ?", new String[]{"1%"}, null);
SMSAdapter smsAdapter = new SMSAdapter(this, cursor);
listView.setAdapter(smsAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

SMSAdapter.java

package com.example.smscontentprovider_01;

import android.content.Context;
import android.database.Cursor;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class SMSAdapter extends CursorAdapter{

private LayoutInflater layoutInflater;
public SMSAdapter(Context context, Cursor c) {
super(context,c);
layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// TODO Auto-generated constructor stub
}

@Override
public void bindView(View view, Context arg1, Cursor arg2) {
// TODO Auto-generated method stub
TextView tvPhoneNumber = (TextView)view.findViewById(R.id.tvPhoneNumber);
TextView tvContent = (TextView)view.findViewById(R.id.tvContent);
tvPhoneNumber.setText(arg2.getString(arg2.getColumnIndex("address")));
tvContent.setText(arg2.getString(arg2.getColumnIndex("body")));
}

@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
View view = layoutInflater.inflate(R.layout.item, null);
return view;
}

}

android SDK给系统程序添了ContentProvider,这样我们就可以通过这些代码来访问这些数据了。


最后不要忘了给他们加上相应的权限