ContactsProvider2

android11 特殊符号开头的联系人显示到“#”分组下面 Android11 Contacts以及ContactsProvider源码修改 阅读详情

本篇不全也不细,只是根据按照个人理解和工作中遇到的问题,总结了个人认为的要点。

1. Android的数据库体系

  • 1.1. 概述
  • 1.2 uri结构

2. ContactsProvider2

  • 2.1. 概述
  • 2.2. Contacts2.db中的表
  • 2.3. ContactProvider2中的实现
  • 2.4. 批量访问

1. Android的数据库体系

1.1. 概述

Android的数据库体系可以分为三个层次:

  1. ContentProvider层;ContentProvider将对数据的增删改查操作进行了抽象,具体实例会注册到AMS中,提供跨进程的服务。ContentProvider可以用于管理各种数据存储源的访问,包括结构化数据(SQLite)和非结构化数据(如图像文件)。
  2. SQLiteDatabase/SQLiteOpenHelper;这部分代码位于“/frameworks/base/core/java/android/database/sqlite/”,ContentProvider要借助于这些框架层的类来和SQLite数据库进行交互。
  3. SQLite数据库;这部分属于native层,代码位于external/sqlite。

ContentProvider不支持线程安全,但SQLite是支持线程安全的(编译前将 宏SQLITE_THREADSAFE 设置为1)。
多个进程可以同时打开一个database,而且可以同时执行SELECT操作,但是同一时间只能有一个进行修改操作。
下面的简图展示了我们使用uri访问database的方式,其中ContentProvider在ActivityManagerService中的register可能是自己所在进程启动时做的,也可能是ActivityManagerService收到uri请求后启动ContentProvider时做的。ContentResolver和ActivityManagerService根据uri中的"authority"来确定要访问的ContentProvider。
在这里插入图片描述

1.2 uri结构
基本结构

[scheme:]scheme-specific-part[#fragment]

进一步划分

[scheme:][//authority][path][?query][#fragment]
path可以有多个,每个用/连接,比如scheme://authority/path1/path2/path3?query#fragment。

query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:
scheme://authority/path1/path2/path3?id = 1#fragment,这里有一个参数id,它的值是1
query参数可以有多个,每个用&连接,如
scheme://authority/path1/path2/path3?id = 1&name = xiaofang&age#fragment
这里有三个参数:
参数1:id,其值是:1
参数2:name,其值是:xiaofang
参数3:age,没有对它赋值

在android中,scheme、authority都是必须要有的,而至于path、query和fragment,它们都是选择性的,可以有也可以没有,但顺序不能变,比如:
"path"可不要:scheme://authority?query#fragment
"path"和"query"可都不要:scheme://authority#fragment
"query"和"fragment"可都不要:scheme://authority/path
“path”,“query”,"fragment"都不要:scheme://authority
等等……

终极划分

[scheme:][//host:port][path][?query][#fragment]


2. ContactsProvider2

2.1. 概述

ContactsProvider2是Android一个很成熟的源生组件,用于管理联系人数据相关的存储区。Google对ContactsProvider2有一个比较详细的介绍,下面是相关链接:
https://developer.android.com/guide/topics/providers/contacts-provider

ContactsProvider2管理了两个database,一个是"contacts2.db",另外一个是"profile.db";本篇着重写contacts.db相关的内容。
在这里插入图片描述

2.2. Contacts2.db中的表

“contacts2.db”数据库中存储了联系人、通话记录和Account等数据。
由于联系人的信息字段比较多,包含了号码、地址、Email和头像等信息,所以数据库中的数据表也比较多;为了提高查询速度,还创建了视图和索引;另外还有触发器。

Android P源码中数据表有30多个,视图有11个;这里就不一一列出了,太占地方了,哈哈。
我们需要搞清楚这些表之间的关系,特别是几个存储重要信息的表,下面是几个重要表的ER图
在这里插入图片描述
表“Contacts”中的数据是在数据插入表“raw_contact”之后,在Transaction的回调onCommit调用序列中插入的。

联系人相关的数据并没有存储在raw_contact表中,而是存储在了Data表中;一条raw_contact数据在Data表中对应多条数据。Data表中有15个data字段,每个字段存储的是什么信息要根据列"mimetype_id"来决定,该列的取值来自"account"表的主键"_ID"。
协定类ContactsContract.java中为data字段定义了映射名称类,如下表:

映射类数据类型备注
ContactsContract.CommonDataKinds.StructuredName与该数据行关联的raw contact的姓名数据。一位raw contact只有其中一行。
ContactsContract.CommonDataKinds.Photo与该数据行关联的raw contact的主要照片。一位raw contact只有其中一行。
ContactsContract.CommonDataKinds.Email与该数据行关联的raw contact的电子邮件地址。一位raw contact可有多个电子邮件地址。
ContactsContract.CommonDataKinds.StructuredPostal与该数据行关联的raw contact的邮政地址。一位raw contact可有多个邮政地址。
ContactsContract.CommonDataKinds.GroupMembership将raw contact链接到联系人提供程序内某个组的标识符。组是帐户类型和帐户名称的一项可选功能。联系人组部分对其进行了更详细的描述。

以“ContactsContract.CommonDataKinds.Email”和“ContactsContract.CommonDataKinds.StructuredName”为例,前者用于联系人的Email信息,后者用于联系人的名字信息; 它们分别在Data表中有一条记录,而且都使用了“data1”、“data2”和“data3”这三个字段,但是每个字段在两条记录中分别存储了不同的信息,如下图:
在这里插入图片描述


2.3. ContactProvider2中的实现

下面是ContactsProvider2的类继承关系图:
在这里插入图片描述
ContactsProvider2直接继承了AbstractContactsProvider.java这个类,它的很多功能都继承自这个抽象父类,看代码时这个抽象父类的代码也是重点。
ContactsProvider2中定义了UriMatcher对象sUriMatcher,并在static块中进行了初始化:

matcher.addURI(ContactsContract.AUTHORITY, "contacts", CONTACTS);
matcher.addURI(ContactsContract.AUTHORITY, "contacts/#", CONTACTS_ID);
matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/data", CONTACTS_ID_DATA);
...
matcher.addURI(ContactsContract.AUTHORITY, "data", DATA);

ContractsProvider2会将接收到的uri和sUriMatcher进行匹配,即根据uri中的path确定要访问的table。
比如,我们向Data表中增加一条数据记录,那么我们会使用

ContactsContract.Data.CONTENT_URI,即"content://com.android.contacts/data"

insertInTransaction方法使用sUriMatcher进行匹配后返回”DATA”,然后在switch的对应case语句中处理这条增加数据的请求。

由于"contacts2.db"中的表比较多,而App层只是通过uri发送请求,那么相关表直接的数据维护逻辑是在ContactsProvider2中完成的,这也方便了App层的使用。为了维护数据一致性和原子性等,ContactsProvider2.java的增/删/改都使用了事务(Transaction),下面的流程图展示了insert操作的事务处理流程,其他操作类似:
在这里插入图片描述

2.4. 批量访问

可以使用 ContentProviderOperation 类中的方法创建一批访问调用,然后通过 ContentResolver.applyBatch(…) 应用这些调用。如果某次批量修改需执行大量操作,则可能会阻塞其他进程,导致整体用户体验不佳。可以将想执行的修改操作尽量分散到各个集合中,并为一项或多项操作设置挂起点。挂起点是一个 ContentProviderOperation 对象,并且其 isYieldAllowed() 值设置为 true。当ContactsProvider2遇到挂起点时,它会暂停其工作,让其他进程运行,并关闭当前事务。当ContactsProvider2再次启动时,它会继续执行 ArrayList 中的下一项操作,并启动新事务。

挂起点会导致每次调用 applyBatch() 时产生多个事务。因此,应为一组相关数据行的最后一项操作设置挂起点。例如,应该为一组操作中添加raw contact行及其关联数据行的最后一项操作设置挂起点,或者针对一组与某位联系人相关的行的最后一项操作设置挂起点。
挂起点也是一个原子操作单元。无论访问成功还是失败,两个挂起点之间的所有访问均以一个单元的形式呈现。如果不设置任何挂起点,则最小的原子操作即为整个批量操作。如果使用挂起点,则可以防止操作降低系统性能,还可确保部分操作为原子操作。


结束
一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写 分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写; 阅读详情

相关推荐

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3229

Android ContactsProvider源码分析

Android源码目录packages\providers下的应用是下载,通话等内置基本应用提供数据存储和操作的provider应用,本文章将针对ContactsProvider源码的架构和实现展开分析。(注:本文使用使用android4.0版本进行分析) 1、架构设计       ContactsProvider中数据操作基类是AbstractContactsProvider.java(参见

Mr. DU 4220

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4865

ContactsProvider2 通讯录部分源码

<br />/*<br /> * Copyright (C) 2009 The Android Open Source Project<br /> *<br /> * Licensed under the Apache License, Version 2.0 (the "License");<br /> * you may not use this file except in compliance with the License.<br /> * You may obtain a copy of th

Android_wy的专栏 6285

硬件原理图分析

文章目录1 硬件原理图分析1.1 MCU部分1.2 NB部分1.3 电源部分 1 硬件原理图分析 1.1 MCU部分 MCU接口部分没啥需要注意,都是常规操作。 1.2 NB部分 U4是用来防静电的。 由于NB的以上几个引脚只支持1.8V,所以这里需要3.3V转1.8V的电路。只要把握住谁改变电平就好分析是怎么实现电平转换的了。 1.3 电源部分 图中的MOS是用来实现USB和电池同时插入时只能USB供电功能的。 ...

木子皿--啥都不会的菜鸟 8173

智能车竞赛新手必看:单车定向组直线竞速与八字慢速实战技巧

本文为智能车竞赛新手提供单车定向组直线竞速与八字慢速的实战技巧,涵盖赛道分析、动力调校、传感器配置等关键环节。通过真实案例和代码示例,详细讲解如何平衡速度与稳定性,帮助选手避免常见失误,提升比赛成绩。特别针对智能车竞赛中的直线竞速和八字慢速项目,提供从硬件选型到临场策略的全方位指导。

weixin_28718793的博客 434

contacts2操作通讯录方法(一)

下载: contact_v2.java ContentValues values = new ContentValues(); Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri)

longxingtianxia_fly的专栏 1348

台达PLC DIAdesigner-AX 编程实战:从安装到通信配置

本文详细介绍了台达PLC DIAdesigner-AX编程的实战操作,从软件安装、项目创建到通信配置的全流程。重点讲解了TCP/IP通信设置、库文件管理及常见错误处理,帮助工程师快速掌握台达PLC编程技巧,提升工业自动化项目的开发效率。

weixin_29215391的博客 530

Android Contact provider基础

Contact providerContact provider是一个强大而又灵活的 Android 组件,用于管理设备上有关联系人数据的中央存储库。 Contact provider是您在设备的联系人应用中看到的数据源,您也可以在自己的应用中访问其数据,并可在设备与在线服务之间传送数据。 提供程序储存有多种数据源,由于它会试图为每个联系人管理尽可能多的数据,因此造成其组织结构非常复杂。 为此,该提

Wtoria的博客 9578

halcon第一讲:基本操作

本文通过Blob分析提取出图片中的硬币,来熟悉halcon的基本操作。 1、读取图像,halcon读取图像有三种方式:1)、文件-&gt;读取图像;2)、通过助手;3)、代码 *打开窗口 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) *读取图像 read_image (Image,'1.png') 读取的图像如下: 2...

qq_24946843的博客 3万+

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 652

API Guides > Contacts Provider (二)

Data From Sync Adapters 用户直接输入联系人的数据到设备中,但是也可以通过sync adapters从服务器上获取联系人的数据。sync adapter 会自动同步设备和服务器上的数据。sync adapter运行在后台,由系统来控制。系统调用ContentResolver去管理数据。 在Android中,和sync adapter一起工作的服务器是由账户类型表示

q2014818的专栏 847

Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网

写在前面 作为一个防御型白帽黑客​ 你一定要知道黑客的进攻套路 才能有相应的防御措施 声明:只做测试,发现对方的漏洞,并不进行破坏性操作 1、 网站分析 地址:http://www.xxx.com.tw/ 这是一家中国台湾地区的网站,看着满屏的繁体字,就不是很舒服 网站首页包括:关于我们、资料下载、联络方式等等。 这些对我们进行sql注入用处并不大 我们需要的是可以进行参数传入的页面,这样我们就可以在参数里做文章 找一下 有没有新闻列表相关的页面 页...

信息安全领域优质创作者|操作系统领域专家 1808

Android 泰语/缅甸语/捷克语下,Contacts列表中联系人出现排序错乱的

修改ContactsProvider2.java文件 public static final String SECTION_HEADING = "SUBSTR(%1$s,1,1)";  SUBSTR(%1$s,1,1) 改为 SUBSTR(%1$s,1,2)

曹浩洋的专栏 1158

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android联系人开发文档,Android联系人模块分析(一)

Android联系人模块分析(一)联系人模块是Android系统中的一个重要的功能模块,目前Android市场上有大量的基于通讯录的应用,本人计划写出系列文章详细介绍联系人模块的结构和使用。作为开头,本篇文章将对ContactsProvider做个简要的介绍。Android系统将联系人的信息存储在sqlite数据库中,并通过ContactsProvider提供查询、更新、删除等操作。所以如果需要掌...

weixin_39744384的博客 448

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android短信选择收件人时,号码搜索联系人修改成任意位置开始中间匹配

ContactsProvider2.java 中的queryLocal函数,修改方法如下:    case CALLABLES_FILTER:       ......     if (searchPhoneNumber) {                                ......                             sb.append(Data

曹浩洋的专栏 1339

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Android ContentProvider 一】关于ContactsContract.CommonDataKinds.Phone.CONTENT_URI的一点理解

一切都要从ContactsContract.CommonDataKinds.Phone.CONTENT_URI说起,前两天

heyzqt 6002

Android数据库内容变化的监听

Android数据库内容变化的监听

fjjjyf的博客 2692

Android2.3修改联系人头像的尺寸和大小

从联系人列表ContactsListActivity.java开始找起,当长按某一个联系人时会弹出Dialog(其实是一个ContextMenu),需找menuitem,找到了case MENU_ITEM_EDIT,这里面会有一个Intent intent = new Intent(this,EditSimContactActivity.class),这是跳转到sim卡联系人,其实还有一个Edit

A2BGeek的专栏 2289

android信息从联系人添加收件人,在联系人多选界面(联系人中有Google账户)搜索时,搜索结果出现排序错误的问题

Google账户mtkshanghai@gmail.com中有很多合并联系人且联系人中有相同的电话号码,从而导致取group分组(PhoneBookIndex)的title和数量,和搜索结果list中的联系人数量不相等, 因为搜索到联系人list的SQL语句会按电话号码分组,相同的号码会被当成一条。 修改ContactsProvider2.java文件case PHONE_EMAIL_

曹浩洋的专栏 1231

android 泰国/缅甸语/捷克较低,Contacts联系出现精神错乱之类的问题清单

更改ContactsProvider2.java文件 public static final String SECTION_HEADING = "SUBSTR(%1$s,1,1)"; SUBSTR(%1$s,1,1)至SUBSTR(%1$s,1,2) 转载于:https://www.cnblogs.com/yxwkf/p/5027445.html...

weixin_30596343的博客 135

android 泰语/缅甸语/捷克语下,Contacts列表中联系人出现排序错乱的问题

修改ContactsProvider2.java文件 public static final String SECTION_HEADING = "SUBSTR(%1$s,1,1)";   SUBSTR(%1$s,1,1) 改为 SUBSTR(%1$s,1,2)

曹浩洋的专栏 1487

在信息收件人里输入号码,不要匹配到电话本里的服务号码

假设电话本里存在SDN(服务号码):"*666" 发送信息,在收件人栏里输入“”,这时会匹配到电话本里的"*222" 如果不希望匹配到服务号码,只是发送给222这个号码,需要做以下修改   [SOLUTION]   1. 修改ContactsProvider2.javas --> PhoneLookupProjectionMap的定义: .add(PhoneLookupC

曹浩洋的专栏 926

Android 之往通讯录中添加数据和查询数据【转】

http://blog.youkuaiyun.com/hosterZhu/archive/2011/01/20/6154461.aspx    首先 我们要在E:\android-sdk-windows\platforms\android-8\sources\ContactsProvider  找到源码 !  因为android自带的通讯录也是通过ContentProvider对外共享数据。  贴...

lcdxwhj2003的专栏 278

Android之联系人处理

联系人处理 Android联系人数据存储框架 联系人数据存储在联系人数据源组件ContactsProvider2中,与一般的数据源存储组件相比,ContactsProvider2更复杂。其中的数据库包含多个表,提供的Uri也更丰富。 联系人数据由3部分组成,联系人基本信息表,如姓名,联系人账号记录表,每个联系人在不同的账号系统下都有相关的信息;联系方式表,联系人具体联系方式数据。 辅助功...

hebeind100的博客 149
上一篇: Service
下一篇: 设计模式小结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值