Eighth

本文深入讲解了Android四大组件之一的ContentProvider,包括其主要方法、数据类型和使用场景。介绍了如何通过ContentResolver进行数据的增删查改操作,并提供了详细的代码示例。

ContentProvider

ContentProvider是Android四大组件之一***

就算这玩意我不喜欢 也要会

Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。

主要方法:
public boolean onCreate() 在创建ContentProvider时调用
public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor
public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中
public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据
public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据
public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型
*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。
*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

代码思路:

1.提供方:ContentProvider
(1)创建数据库,自定义类继承SQLiteOpenHelper
(2)自定义内容提供者类,继承ContentProvider,重写insert/delete/update/query方法,向外界提供方法
(3)清单文件中注册内容提供者
2.索要方:ContentResolver
(1)通过Context的getContentResolver方法获得ContentResolver对象
(2)确定uri

代码:


/** 
 * MainActivity 
 *  
 * @author zuolongsnail 
 */  
public class MainActivity extends Activity {  
    private EditText nameET;  
    private EditText numberET;  
    private Button insertBtn;  
    private Button deleteBtn;  
    private Button queryBtn;  
    private ListView contentView;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        nameET = (EditText) findViewById(R.id.name);  
        numberET = (EditText) findViewById(R.id.number);  
        insertBtn = (Button) findViewById(R.id.insert);  
        deleteBtn = (Button) findViewById(R.id.delete);  
        queryBtn = (Button) findViewById(R.id.query);  
        // 用于显示数据  
        contentView = (ListView) findViewById(R.id.content);  
        insertBtn.setOnClickListener(new OperateOnClickListener());  
        deleteBtn.setOnClickListener(new OperateOnClickListener());  
        queryBtn.setOnClickListener(new OperateOnClickListener());  
    }  
  
    class OperateOnClickListener implements OnClickListener {  
        @Override  
        public void onClick(View v) {  
            String name = nameET.getText().toString();  
            String number = numberET.getText().toString();  
            Person p = new Person(name, number);  
            switch (v.getId()) {  
            // 插入数据  
            case R.id.insert:  
                insert(p);  
                view();  
                break;  
            // 删除数据  
            case R.id.delete:  
                delete(name);  
                view();  
                break;  
            // 查询数据  
            case R.id.query:  
                view();  
                break;  
            }  
        }  
    }  
  
    // 显示数据  
    private void view() {  
        Cursor c = query("");  
        ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,  
                c, new String[] { People._ID, People.NAME, People.NUMBER },  
                new int[] { R.id.id, R.id.name, R.id.number });  
        contentView.setAdapter(listAdapter);  
    }  
  
    // 插入联系人  
    private void insert(Person p) {  
        // 获得ContentResolver对象  
        ContentResolver cr = getContentResolver();  
        ContentValues values = new ContentValues();  
        values.put(People.NAME, p.name);  
        // 表示是否把联系人添加到收藏(加星),1表示加入,0表示不加入,这行代码注释默认是不加入。  
        values.put(Contacts.People.STARRED, 1);  
        Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);  
        // 获得联系人People表的Uri  
        Uri url = Uri.withAppendedPath(uri,  
                Contacts.People.Phones.CONTENT_DIRECTORY);  
        values.clear();  
        values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);  
        values.put(Contacts.Phones.NUMBER, p.number);  
        // 插入操作  
        cr.insert(url, values);  
    }  
  
    // 插入联系人  
    private void delete(String name) {  
        // 获得ContentResolver对象  
        ContentResolver cr = getContentResolver();  
        Uri url = Contacts.People.CONTENT_URI;  
        // 设置删除条件  
        String where = People.NAME + "=?";  
        String[] selectionArgs = { name };  
        cr.delete(url, where, selectionArgs);  
    }  
  
    // 查询联系人  
    private Cursor query(String name) {  
        // 获得ContentResolver对象  
        ContentResolver cr = getContentResolver();  
        Uri uri = Contacts.People.CONTENT_URI;  
        // 查询对象  
        String[] projection = { People._ID, People.NAME, People.NUMBER };  
        // 设置查询条件,这里我把selection和selectionArgs参数都设为null,表示查询全部数据  
        String selection = null;  
        String[] selectionArgs = null;  
        if (!"".equals(name)) {  
            selection = People.NAME + "=?";  
            selectionArgs = new String[] { name };  
        }  
        // 设置排序条件  
        String sortOrder = Contacts.People._ID;  
        Cursor c = cr.query(uri, projection, selection, selectionArgs,  
                sortOrder);  
        // if (c.moveToFirst()) {  
        // for (int i = 0; i < c.getCount(); i++) {  
        // c.moveToPosition(i);  
        // String name = c.getString(c.getColumnIndexOrThrow(People.NAME));  
        // String number = c.getString(c  
        // .getColumnIndexOrThrow(People.NUMBER));  
        // }  
        // }  
        return c;  
    }  
}  

转载: https://blog.youkuaiyun.com/wjq0522/article/details/80761635

感谢 wjq0522 童鞋

对不起,我是真的不会,知识浅薄 ,告辞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值