比如说ContactSaveService怎么联系到ContactsProvider2的,通过哪些函数?

解决方案 »

  1.   

    主要是通过获得ContentResolver类  对数据库进行操作的final ContentResolver resolver = getContentResolver();        // Load raw contact IDs for all raw contacts involved - currently edited and selected
            // in the join UIs
            Cursor c = resolver.query(RawContacts.CONTENT_URI,
                    JoinContactQuery.PROJECTION,
                    JoinContactQuery.SELECTION,
                    new String[]{String.valueOf(contactId1), String.valueOf(contactId2)}, null);.....   建议LZ还是多看看源码。
      

  2.   

    既然你要用provider,应该少不了query,delete,update这类操作吧,把uri,selection这些参数传好就可以使用了啊。
      

  3.   

    类ContactSaveService中方法:
    private void createRawContact(Intent intent) {
            String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
            String accountType = intent.getStringExtra(EXTRA_ACCOUNT_TYPE);
            String dataSet = intent.getStringExtra(EXTRA_DATA_SET);
            List<ContentValues> valueList = intent.getParcelableArrayListExtra(EXTRA_CONTENT_VALUES);
            Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
            operations.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                    .withValue(RawContacts.ACCOUNT_NAME, accountName)
                    .withValue(RawContacts.ACCOUNT_TYPE, accountType)
                    .withValue(RawContacts.DATA_SET, dataSet)
                    .build());        int size = valueList.size();
            for (int i = 0; i < size; i++) {
                ContentValues values = valueList.get(i);
                values.keySet().retainAll(ALLOWED_DATA_COLUMNS);
                operations.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                        .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                        .withValues(values)
                        .build());
            }        ContentResolver resolver = getContentResolver();
            ContentProviderResult[] results;
            try {
                results = resolver.applyBatch(ContactsContract.AUTHORITY, operations);
    //此处跟进去到IContentProvider里还是不知道怎么操作数据库的??用啥联系上的?
            } catch (Exception e) {
                throw new RuntimeException("Failed to store new contact", e);
            }        Uri rawContactUri = results[0].uri;
            callbackIntent.setData(RawContacts.getContactLookupUri(resolver, rawContactUri));        deliverCallback(callbackIntent);
        }
      

  4.   

    用ContentProvider+数据库访问Uri吧,其实楼主下个源码看看一下子就明白了!
      

  5.   

    最后还是落实到sql语句,只是多封装了几层而已,如果你自己跟踪代码的调用流程,找个provider再把这个目录的代码(frameworks\base\core\java\android\database\sqlite)手动添加到工程,调试下就知道了,按你的问题可以先找谁实现applyBatch这个函数,多搜搜网上应该也会有人讲到。
      

  6.   

    ContactSaveService中的函数名和实际操作是对应的,联系人是存在数据库中的,不会直接操作数据库,而是通过ContentProvider来操作数据库,区分不同的数据库,是通过URI来实现的,由ContentProvider来实现对数据库的增删改查。-----这里理论部分。
        举个例子:ContactSaveService::createRawContact-->ContentProvider::applyBatch--这个过程就是联系界面和数据库的过程,第一个参数uri在ContactsContract.java中实现,第二个参数数据的操作,在ContactsOperationBatch.java中实现
        这个ContactsContract.AUTHORITY,就是之间连接的关键,可以在项目中搜索这个字段,就能到ContactsProvider2了
        楼主,接分了。