今天我主要是复习了一下内容的提供者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; } }
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; } }
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,这样我们就可以通过这些代码来访问这些数据了。