内容提供者——fragment

1.内容提供者是安卓四大组件之一,其作用是把数据暴露给其他应用,通常来说是把私有数据暴露给其他应用。下面我们用对手机短信和电话号码信息的获取和增,删,改。来具体说明其作用。准确的来说内容提供者是起到了中间人的作用,应为一些私有数据是无法被其他应用直接访问的(如果能随意被访问的话其数据就可以被用户随意改变这样是不安全的)。这是候我们需要一个中间人来帮我们去获取。像短信和电话信息他们都有自己的内容提供者。如果该应用只想私有数据只能被访问但不能被修改,这时候内容提供者只需要重写,db.quary();方法就可以。如果我们会自定义内容提供者那我们就可以很好的调用内容提供者了。自定义内容提供者的代码如下。

public class personProvider extends ContentProvider {

private MyOpenHelper oh;
SQLiteDatabase db;


//创建uri匹配器对象
static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
//检测其他用户传入的uri与匹配器定义好的uri中,哪条匹配
static {
um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/person
um.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacher
um.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4
}

//内容提供者创建时调用
@Override
public boolean onCreate() {
oh = new MyOpenHelper(getContext());
db = oh.getWritableDatabase();
return false;
}


@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
if(um.match(uri) == 1){
cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);
}
else if(um.match(uri) == 2){
cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
}
else if(um.match(uri) == 3){
//把uri末尾携带的数字取出来
long id = ContentUris.parseId(uri);
cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);
}
else{
throw new IllegalArgumentException("uri又有问题哟亲么么哒");
}
return cursor;
}


@Override
public String getType(Uri uri) {
if(um.match(uri) == 1){
return "vnd.android.cursor.dir/person";
}
else if(um.match(uri) == 3){
return "vnd.android.cursor.item/person";
}
return null;
}


//此方法供其他应用调用,用于往people数据库里插数据
//values:由其他应用传入,用于封装要插入的数据
//uri:内容提供者的主机名,也就是地址
@Override
public Uri insert(Uri uri, ContentValues values) {
//使用uri匹配器匹配传入的uri
if(um.match(uri) == 1){
db.insert("person", null, values);

//发送数据改变的通知
//uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知
getContext().getContentResolver().notifyChange(uri, null);
}
else if(um.match(uri) == 2){
db.insert("teacher", null, values);

getContext().getContentResolver().notifyChange(uri, null);
}
else{
throw new IllegalArgumentException("uri有问题哟亲么么哒");
}
return uri;
}


@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int i = db.delete("person", selection, selectionArgs);
return i;
}


@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int i = db.update("person", values, selection, selectionArgs);
return i;
}

解释下上面关键代码:如果你创建了一个内容提供者类,你需要实现 update(),delete(),quary(),insert()等这几个方法。如果改内容提供者需要向其他应用提供什么功能(查找,插入等)你只需要重写这些方法就可以了。static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);如果不使用匹配器的话,我们通过Uri只能操作一张表,但是一个应用的数据库往往是由很多张表构成的。所以获取匹配器对象是为了实现可以多张表的操作。注内容提供者包名后面可以携带数据。所以我们使用内容提者的思路就很清晰了。第一步:得到内容提供者对象 ContentResolver cr = getContentResolver();;得到对象后你就可以执行你所需要完成的方法。

例如 cr. insert(Uri.parse("content://com.Meiko.whh"), valuse);("content://com.Meiko.whh")是内容提供者的包名。

public void insert(View v) {


cr = getContentResolver();
ContentValues valuse = new ContentValues();
valuse.put("name", "吴晗晗");
valuse.put("money", 15000);
cr.insert(Uri.parse("content://com.Meiko.whh"), valuse);


}

2:fragment是android在3.0之后出现的,当时主要是为了解决平板屏幕大 (因为手机屏幕小布局看起来良好但是同样布局放到平板上去就会显得很不协调,屏幕一侧有布局另一侧就会显得很空)。为了解决这个问题谷歌想到了一个方法把大屏幕分成几部分这样就会有很好的效果。例如改图例如改图左边就是功能选项右边是实现的布局,下面是fragment的生命周期实现上面代码如下:

fragment代码:public class fragment1 extends Fragment {
EditText et;
Button bt;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {


View v = inflater.inflate(R.layout.fragment01_activity, null);
et = (EditText) v.findViewById(R.id.et_fragment);
bt = (Button) v.findViewById(R.id.bt_fg);
bt.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String fg = et.getText().toString();
((MainActivity) getActivity()).puttext(fg);
}
});
return v;
}


public void settext(String a) {
et.setText(a);
}


}

Mainactivity代码

public class MainActivity extends Activity {
EditText ets;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
        ets=(EditText) findViewById(R.id.et_main);
}


public void red(View v) {
fragment1 fg1 = new fragment1();
FragmentManager fgr = getFragmentManager();
FragmentTransaction fts = fgr.beginTransaction();
fts.replace(R.id.fg, fg1);
fts.commit();
}
public void green(View v) {
fragment2 fg2 = new fragment2();
FragmentManager fgr = getFragmentManager();
FragmentTransaction fts = fgr.beginTransaction();
fts.replace(R.id.fg, fg2);
fts.commit();
}
public void bule(View v) {
fragment3 fg3 = new fragment3();
FragmentManager fgr =getFragmentManager();
FragmentTransaction fts = fgr.beginTransaction();
fts.replace(R.id.fg, fg3);
fts.commit();
}


public void gotos(View v){
String ma=ets.getText().toString();
fragment1 fg=new fragment1();
fg.settext(ma);

}
public void puttext(String b){
ets.setText(b);
}
}

注意:activity 与fragment直接的数据交流问题。1:把activity数据给fragment :第一在activity中new出fragment对象得到对象后用对象调其方法。通过有参函数将数据传输过去2:fragment向activity传数据:在fragment中通过getactivity获取上下文,然后进行强转例如*(Mainactivity)getactivity 这样就可以调用activity中的方法然后将数据传送过去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值