首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android联系人应用怎么调到数据库操作的

2012-12-15 
android联系人应用如何调到数据库操作的?比如说ContactSaveService怎么联系到ContactsProvider2的,通过哪

android联系人应用如何调到数据库操作的?
比如说ContactSaveService怎么联系到ContactsProvider2的,通过哪些函数?
[最优解释]
主要是通过获得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还是多看看源码。
[其他解释]
ContactSaveService中的函数名和实际操作是对应的,联系人是存在数据库中的,不会直接操作数据库,而是通过ContentProvider来操作数据库,区分不同的数据库,是通过URI来实现的,由ContentProvider来实现对数据库的增删改查。-----这里理论部分。
    举个例子:ContactSaveService::createRawContact-->ContentProvider::applyBatch--这个过程就是联系界面和数据库的过程,第一个参数uri在ContactsContract.java中实现,第二个参数数据的操作,在ContactsOperationBatch.java中实现
    这个ContactsContract.AUTHORITY,就是之间连接的关键,可以在项目中搜索这个字段,就能到ContactsProvider2了
    楼主,接分了。
[其他解释]
用ContentProvider+数据库访问Uri吧,其实楼主下个源码看看一下子就明白了!
[其他解释]
最后还是落实到sql语句,只是多封装了几层而已,如果你自己跟踪代码的调用流程,找个provider再把这个目录的代码(frameworks\base\core\java\android\database\sqlite)手动添加到工程,调试下就知道了,按你的问题可以先找谁实现applyBatch这个函数,多搜搜网上应该也会有人讲到。

[其他解释]
该回复于2012-12-01 09:58:36被管理员删除
[其他解释]
是我表述不清?怎么没人回复。。
[其他解释]
既然你要用provider,应该少不了query,delete,update这类操作吧,把uri,selection这些参数传好就可以使用了啊。
[其他解释]
类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);
    }

热点排行