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);
}