我在示例代码上看到先是用ContactsContract.Contacts.CONTENT_URI获取了一个Cursor,而后面在构造ListAdapter的时候用了这个Cursor,但是指定了从PhoneLookup.DISPLAY_NAME和PhoneLookup.NUMBER两个字段去取数据。可是我看了看ContactsContract.Contacts并没有PhoneLookup这样的成员能否说明一下ContactsContract.Contacts,PhoneLookup.DISPLAY_NAME和PhoneLookup.NUMBER这三者在实际数据库中的对应关系?

解决方案 »

  1.   


    1.这事很复杂,你可以google一下,多看几篇文章。2. 那个实际数据库,你找一下,手机ROOT以后,用RE在目录/dbdata/database/com.android.providers.contacts/下面有个contacts2.db,拷出来,用sqlite管理器打开看看,就能看到数据库结构了。
      

  2.   

    ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider 对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。
    使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
    当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:
    public class PersonContentProvider extends ContentProvider{
       public boolean onCreate()
       public Uri insert(Uri uri, ContentValues values)
       public int delete(Uri uri, String selection, String[] selectionArgs)
       public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
       public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
       public String getType(Uri uri)}
    第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
    <manifest .... >
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.providers.personprovider"/>
        </application>
    </manifest>
      

  3.   

    ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider 对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。
    使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
    当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:
    public class PersonContentProvider extends ContentProvider{
       public boolean onCreate()
       public Uri insert(Uri uri, ContentValues values)
       public int delete(Uri uri, String selection, String[] selectionArgs)
       public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
       public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
       public String getType(Uri uri)}
    第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
    <manifest .... >
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.providers.personprovider"/>
        </application>
    </manifest>