ContentProvider
四大组件之一,应用程序间唯一的共享数据途径.
功能:存储并检索数据(增删改查)及向其它应用程序提供访问数据的接口
系统提供内置的ContentProvider有(音频,图像,视频,手机通讯录等),这些都位于android.provider包下
让自己的程序和其它程序共享数据有两种方式:
1.创建自己的ContentProvider(及继承ContentProvider类).
2.将自己的数据添加到已有的ContentProvider中(需保证现有的ContentProvider跟自己的数据类型相同并且有对ContentProvider写入权限)
对于ContentProvider最重要的是数据模型和URI
1.数据模型(就是实体类)
2.URI(统一资源标示符)
每一个ContentProvider都对外提供一个公开的URI都以"Content://"开头
如果一个ContetnProvider管理多个数据集,将会为每一个数据集分配一个独立的URI
public class UIContentProviderActivity extends Activity {
static final String[] Columns = new String[]{
Contacts._ID,
Contacts.DISPLAY_NAME,
};
TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//本示例代码功能为显示联系人信息
tv =(TextView)findViewById(R.id.tv);
String result = getQueryData();
tv.setText("ID\tName\t" + result);
}
private String getQueryData(){
String result ="";
/*
* 查询CotentProvider的方法有两个:
* 1.通过获取ContentResolver对象的query()
* 2.通过Activity的managedQuery()
* 区别:
* 返回的都是Cursor对象,managedQuery()是让Activity管理Cursor的生命周期.
* Activity进入暂停状态调用deactivate()卸载,当Activity回到运行状态时调用requery()重新查询生成Cursor对象.
* 第一个情况如果想让Activity管理Cursor的生命周期.加上startManagingCursor(cursor);
*/
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(Contacts.CONTENT_URI, Columns, null, null, null);
//startManagingCursor(cursor);
//Cursor c = managedQuery(Contacts.CONTENT_URI, Columns, null, null, null);
cursor.moveToFirst();
while(!cursor.isAfterLast()){
String id = cursor.getString(cursor.getColumnIndex(Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME));
result = result+ id+"\t";
result = result+ name+"\t\n";
cursor.moveToNext();
}
cursor.close();
return result;
}
}
Preferences
程序内部轻量级的数据存储方案,主要用于存储和查询简单的数据类型(int,float,double,boolean,String等)
一般用来存储应用程序的设置信息,如应用程序的色彩方案,文字字体等.
存储方式:
1.每一个SharedPreferences对象,都保存在应用程序的私有文件夹下,
以一个SharedPreferences对象名称命名的XML文件,其键值对放在相应的标记中.
2.如果是调用Activity对象的getPreferences()的方式,文件名是该Activity的名称
public class UIPreferencesActivity extends Activity {
public static final String EDIT_TEXT_KEY = "EDIT_TEXT";
EditText editText;
SharedPreferences sharedPreferences;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//本示例代码功能为在编辑框输入文字后,切换至后台,然后在切换会本Activity编辑框输入的文字依然存在
editText = (EditText)findViewById(R.id.editText);
/*
* 获取Preferences对象的二种方式:
* 1. 调用Context对象的getSharedPreferences(名称,打开模式)获得SharedPreferences对象
* 2. 调用Activity对象的getPreferences(打开模式)获得SharedPreferences对象
*
* 区别:
* 第一种方式获得的SharedPreferences对象可以被同一应用程序下其它组件共享
* 第二种方式获得的SharedPreferences对象只被调用该方法的Activity使用
*/
sharedPreferences = getSharedPreferences(EDIT_TEXT_KEY, MODE_PRIVATE);
//sharedPreferences = getPreferences(MODE_PRIVATE);
String result = sharedPreferences.getString(EDIT_TEXT_KEY, null);
if(result!=null){
editText.setText(result);
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(EDIT_TEXT_KEY, editText.getText().toString());
editor.commit();
super.onDestroy();
}
}