Android M 原生Contacts — 界面和数据库

下面的讲解基于AndroidM

整体认识

这里写图片描述
联系人应用其主要的功能就是管理手机中存储的联系人信息,为了更好的管理信息数据,我们就引入了数据库,所以对于联系人的整体认识,我们就可以将其看成是数据库,联系人的整个业务逻辑都会围绕数据库展开。

源码路径和类

android/packages/apps/Dialer
android/packages/apps/Contacts
android/packages/apps/ContactsCommon
android/packages/providers/ContactsProvider
android/packages/providers/CallLogProvider
android/vendor/qcom/proprietary/telephony-apps/SimContacts
data/data/com.android.dialer/databases/dialer.db
data/data/com.android.providers.contacts/databases/contacts2.db
data/data/com.android.providers.contacts/databases/profile.db 机主信息数据库

ContactsDatabaseHelper.java 数据库创建类
ContactsProvider2.java 数据库操作类
ContactContract.java 数据库定义类

部分UI相关类

这里写图片描述
上图列出了部分界面相关的类和说明,这里列出了应用中大部分可以见的activity、fragment和view

主界面

这里写图片描述
上图是contacts的主界面PeopleActivity,对应颜色的图形与对应颜色的类名相对应,这里只对主界面做了简单介绍,其它的界面读者可以通过IDE工具或者源码去分析。

数据库

这里写图片描述
这里写图片描述
上图是对于contacts数据库的整体截图,我们可以看到,数据库中的表有很多,每张表都有不同的作用,我们这里比较关心的是图中用红色矩形框出来的表,从官方给出的介绍图可以看出,一个contact对应多个row contact,一个row contact 对应多个data。

各个表中对应数据的含义

contacts表

  • name_raw_contact_id:对应raw_contacts表中的id,即界面显示的contact
  • photo_id:模糊大头贴id
  • photo_file_id:清晰大头贴id
  • custom_ringtone:个人铃声
  • send_to_voicemail:来电转接语音信箱(0 false,1 true)
  • times_contacted:联系人联系次数
  • last_time_contacted:最近一次联系的时间
  • starred:是否收藏
  • pinned:是否被固定
  • has_phone_number:是否有号码(至少一个)
  • lookup:查找此联系人的key值
  • contact_last_updated_timestamp:联系人最后修改时间

raw_contacts表

  • account_id:记录所属账户id
  • sourceid:数据源id
  • backupid:数据备份时产生的id
  • raw_contact_is_read_only:是否只读(1只读,0可删除)M中没用
  • version:数据发送变化时改变
  • dirty: version变化,值为1,需同步数据
  • deleted:标记是否为删除的记录
  • contact_id:对应contacts表中的id
  • aggregation_mode:标记是否需要合并(default:0?immediate:1 suspended:2 disabled:3 )
  • aggregation_needed:是否需要合并(1需要,0不需要)
  • custom_rington:与该记录相关的手机铃声
  • send_to_voicemail:来电转接语音信箱
  • times_contacted:与该联系人联系的次数
  • last_time_connected:最近一次联系时间
  • starred:是否收藏(1收藏,0没收藏)
  • pinned:是否被固定
  • display_name:联系人显示名称
  • display_name_alt:联系人显示名称的替代表示(如西方名字“名在前”)
  • display_name_source:名字显示数据类型:email、phone、name
  • phonetic_name: 发音名字
  • phonetic_name_style:名字不同发音风格(undefined=0,pinyin=3,japanese=4,korean=5)
  • sort_key:排序字段
  • phonebook_label:首字母
  • phonebook_bucket:对应首字母的排序
  • sync1、2、3、4:同步相关,保存uri,同步状态,服务器版本,错误代码等等

data表

  • mimetype_id:数据类型id,对应mimetypes表
  • raw_contact_id:对应raw_contact的id
  • is_primary,is_super_primay:是否为默认号码
  • data_version:此数据记录的版本,每当数据行更改版本上升,此值单调递增
  • data1-data15 :同类数据的不同形式的表达方式
  • carrier_presence:载波信息 -

accounts表

存储当前联系人有哪些账户信息,比如:SIM、Google、localphone等等。

calls表

记录了dialer里面的通话信息,包括:通话时间,号码,次数,类型,等等。

mimetypes表

里面记录了数据库中所有数据的类型。

其它

还有一些相关的view,比如:view_contacts、view_data、view_row_contacts等等,这些视图包含了上面的多个表的数据,一般的查询操作都是对view的操作。

一个联系人信息

这里写图片描述
这里写图片描述

Dialer&Contacts整体图

这里写图片描述


http://blog.csdn.net/michael_yt/article/details/52650282

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 中实现数据库和表的创建,需要使用 SQLite 数据库。以下是一个简单的步骤: 1. 在 Android Studio 中创建一个新的项目。 2. 在项目中创建一个新的 Java 类,用于管理数据库的操作。 3. 在该类中,创建一个 SQLiteOpenHelper 子类,并实现其构造函数和两个回调函数:onCreate() 和 onUpgrade()。 4. 在 onCreate() 回调函数中,使用 SQL 语句创建数据库和表。 5. 在主要的 Activity 类中,实例化该数据库管理类,并调用其方法进行数据库的操作。 以下是一个简单的示例,演示如何在 Android Studio 中创建一个名为 "Contacts" 的数据库,并在其中创建一个名为 "Friends" 的表: 1. 创建一个新的 Java 类,例如 "DatabaseHelper"。 2. 在该类中,创建一个 SQLiteOpenHelper 子类并实现其构造函数和两个回调函数: ```java public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "Contacts.db"; private static final int DATABASE_VERSION = 1; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE Friends (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT," + "phone TEXT)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS Friends"); onCreate(db); } } ``` 3. 在主要的 Activity 类中,实例化该数据库管理类,并调用其方法进行数据库的操作: ```java public class MainActivity extends AppCompatActivity { private DatabaseHelper mDatabaseHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDatabaseHelper = new DatabaseHelper(this); SQLiteDatabase db = mDatabaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "John"); values.put("phone", "123456789"); db.insert("Friends", null, values); Cursor cursor = db.rawQuery("SELECT * FROM Friends", null); while(cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); String phone = cursor.getString(cursor.getColumnIndex("phone")); Log.d("MainActivity", "Name: " + name + ", Phone: " + phone); } cursor.close(); db.close(); } } ``` 在上面的示例中,我们在 onCreate() 回调函数中使用 SQL 语句创建了一个名为 "Friends" 的表,并在主要的 Activity 类中实例化了该数据库管理类,并使用其方法进行了数据库插入和查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值