了解Android联系人的架构

2024-02-28

我正在开发一个 Android 应用程序,它需要知道何时添加/更新/删除联系人。

所以我读了几篇文章。据我所知,每当联系人发生更改时,我们都可以通过内容观察者收到通知,但我们无法获取已添加/更新/删除的联系人。因此,我阅读了官方 API 并准备了如何捕获该特定联系人的设计。

所以我一开始是这么想的

  1. 我们将存储所有联系人Is、删除标志和版本
  2. 每当联系人发生变化时,我都会从 Android 系统获取表的行数和行数。
  3. 如果我的行计数小于系统行计数,则联系人已被删除。
  4. 如果我的行计数大于系统行计数,则已添加联系人。
  5. 如果情况并非如此,则其中一个联系人版本已更改。

我还了解到,如果用户删除了联系人,Android 不会删除该联系人,但它会在已删除标志上设置 0。因此在这些情况下行数将相同。

Android 还会多次更改联系人的行 ID,如官方文档中所述。那么我们如何才能像查找 uri 一样唯一地识别它们,如果不能,那么我们也必须为其设置观察者。

所以我想知道上面的说法是否正确?在添加联系人的情况下,它是否会添加到光标的最后一行意味着如果我检查系统数据库的最后一行是否有联系人,它是否会给我添加的联系人。


让我尽可能解释一下。基本上你的政策看起来不错,但实际上比你想象的要复杂一些。

在安卓上,一个联系人可以与多个相关联raw联系人 http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html,可能由许多数据提供商提供,例如 Google、Facebook、Skype 等。例如,如果您的本地联系人中的一位朋友也在使用 Skype,则有两个原始联系人分别存在于ContactContracts.RawContacts http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html,但它们会自动聚合,并在您查询时显示为一个联系人ContactsContract.Contacts http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html.

这也是为什么很难唯一地识别联系人的原因,因为随时都可以。LOOKUP_KEY对于这种情况不太方便。

除 Google 之外的许多应用程序仅提供单向同步,i.e.仅从服务到联系人,因此它们是只读的。在这种情况下,删除标志将不会被使用,而是在同步过程中被删除。因此,你不能简单地依赖标志。

尽管没有一个好的简单解决方案,但我想如果您观察特定的情况,实现您想要的目标会容易得多RawContacts, not Contacts。希望这有助于您的理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解Android联系人的架构 的相关文章

  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • Android系统每个应用程序的通知限制

    这可能偏离主题 但我找不到任何相关内容 Android应用程序可以显示的通知数量有限制吗 我在收到 100 条通知后遇到问题 没有文件明确说明这一点 注意 显示 100 条通知并不是一个好主意 但由于某些原因这是必需的 In API23 包
  • eclipse - 在android虚拟设备中卡住中文

    当我在 Eclipse 中运行 Android 模拟器时 当我尝试编写文本时 所有键盘字符都会被翻译为中文 为什么是这样 Thanks 点击并按住EditText Select 输入法 Select 安卓键盘
  • android中如何布局支持各种屏幕?

    我正在使用gridview开发图库视图 在小屏幕中我的布局设计修复得很好 但大屏幕没有我的设计 在大屏幕中有一些空格 加载更多图片 按钮参考图2 我该如何解决这个问题 我的清单文件添加了这一行以支持各种屏幕 请给我一些示例代码
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 停止前台运行的服务的正确方法是什么

    我正在尝试停止作为前台服务运行的服务 当前的问题是当我打电话时stopService 通知仍然保留 因此 在我的解决方案中 我添加了一个接收器 我正在将其注册到onCreate 在 的里面onReceive 我调用的方法stopforegr
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 从包中发布的错误通知无法展开 RemoteViews

    我有个问题 有时我的服务会被这个 logcat 强制关闭 03 26 20 44 44 849 E AndroidRuntime 12080 FATAL EXCEPTION main 03 26 20 44 44 849 E Android
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • Fragment 的 onSaveInstanceState() 永远不会被调用

    我试图将数据保存在片段的 onSaveInstanceState 中 但该方法从未被调用 有人可以帮忙吗 public class MyFragment extends Fragment Override public View onCre
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 如何在java 1.8中从org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8转换为oracle.jdbc.OracleConnection

    如何在 java 1 8 中从 org jboss jca adapters jdbc jdk8 WrappedConnectionJDK8 转换为 oracle jdbc OracleConnection 目前我正在这样使用并得到以下异常
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav

随机推荐

  • Docker 出现 cmake 错误:ForceToRelativePath 失败

    我一直在尝试使用cmake在docker中编译一个项目 但是 我收到以下错误 cmake build cmake pCygIN cmake 3 13 4 Source cmOutputConverter cxx 125 static std
  • 带有 animate.css 的猫头鹰轮播标题

    我正在尝试在猫头鹰轮播中制作字幕 我正在使用 animate css 我已在轮播中的字幕中添加了动画 但它并不适用于所有人 只有第一张幻灯片的标题有动画 这是我的代码 div class owl carousel owl theme div
  • NSIncation 和 block 有什么区别?

    当我说阻止时 我的意思是 int a return a a 另外 block仅支持iOS4及以上版本 这两者有什么区别 An NSInvocation是一条发送给对象的消息 使用选择器 带有可选参数 可以稍后 或现在 执行 并且在当前上下文
  • 更改 Nestjs 中的 dist 目录

    我正在构建一个基于 Nestjs 的 API 这main ts文件嵌套在 my 的子文件夹中src目录 结果 编译后的文件也嵌套在dist目录和我的入口点是dist api main js代替dist main js 我希望保持这种状态 当
  • 强制 SHBrowseForFolder() 显示所需的目录

    我已经在网上搜索并与这件事斗争了一个多小时 但似乎仍然无法让它发挥作用 大多数人在论坛等上看到这里时似乎很满意 但我的仍然不起作用 我试图强制 SHBrowseForFolder 函数在我选择的文件夹中启动 char current MAX
  • 强制另存为,MS Excel VBA

    我对 MS Office 产品中的 VBA 有点陌生 我一直在寻找一些代码 这些代码将强制用户 另存为 我用作模板的 xls 文件 但它不是实际的模板文件类型 基本上 我有这个 用户打开 xls 在某个字段中输入一些数据 然后文件 gt 另
  • 具有动态参数的表达式树

    我想转换这个 Func
  • 在 try catch 中访问变量

    我在返回 menuFont 行上不断收到编译错误 它表示没有变量 menuFont 有人可以告诉我如何解决这个问题吗 import java awt Font import java awt FontFormatException impo
  • 发送电子邮件的代码

    我在这里做错了什么 private void SendMail string from string body string mailServerName plus pop mail yahoo com MailMessage messag
  • 删除字符串中的空格

    我必须摆脱超过 1 个空格也就是说 如果有超过 1 个空格 我会将其替换为单个空格 这就是我的做法 但我真的很困惑哪种方法是最好的方法以及所有这些方法有什么区别 下面是我的代码 public class SspaceDemo public
  • 已弃用的 API 和旧版 API 之间的区别?

    我正在研究 Java 中的遗留 APICollection Framework我了解到诸如此类的课程Vector and HashTable已被取代ArrayList and HashMap 然而 它们仍然没有被弃用 并且被视为遗留 本质上
  • WordPress 的 Docker 运行缓慢

    Problem 我在使用 WordPress 和 Docker 时遇到问题 因为我的网站加载时间很慢 7 秒 我不确定为什么会发生这种情况 但我认为这与外部数据库或共享卷有关 Setup 我有一个使用 XDebug 和 Mailhog 在
  • C++ - 如何找到整数的长度

    我试图找到一种方法来查找整数的长度 位数 然后将其放入整数数组中 该作业还要求在不使用 STL 中的类的情况下执行此操作 尽管程序规范确实说我们可以使用 通用 C 库 我会问我的教授是否可以使用 cmath 因为我假设 log10 num
  • salesforce 中的联合身份验证和委派身份验证

    有人知道 salesforce 中的联合身份验证和委托身份验证之间的区别吗 您能解释一下这两种方法中的请求流程吗 主要区别在于联合身份验证上安全断言标记语言 SAML 的使用 委托认证如果您的组织中有移动用户 或者您想要启用委派身份验证 单
  • 如何判断我的应用程序是否从后台恢复?

    我想在应用程序进入后台时锁定它 当它恢复时我想显示我自己的锁定屏幕 锁屏是我的应用程序的一个活动 成功输入密码后 用户可以看到恢复的 Activity 否则他不能 我怎样才能做到这一点 主要问题是 当你开始一个项目时 你必须得到一个特定的行
  • 如何在 Django 中将两个模型字段表示为一个表单字段?

    我似乎无法弄清楚如何在 Django 中正确处理以下情况 我在模型中有一个日期范围 我将其存储为两个单独的字段 date start and date end start date models DateTimeField end date
  • 如何解决 C++ 中友元声明的循环依赖?

    为什么以下代码无法编译以及如何修复它 我得到的错误是 使用未声明的标识符 Foo 虽然Foo在错误发生的地方 在friend声明于Bar foo h ifndef FOO H define FOO H include bar h neede
  • 使用位掩码组合枚举值

    我知道可以在枚举值中使用位掩码 但我不知道如何创建它 我有一个简单的枚举 enum State minimizing 0 maximizing minimized maximized 状态总是State minimized or State
  • 在同一行初始化两个变量

    我很难找到这个概念的权威例子或讨论 如果我的 Ruby 方法中有 2 个数字变量 我需要将它们初始化为零 它们将用作计数器 这可以吗 安全吗 它在我的测试中有效 而不是这个 foo 0 bar 0 你可以这样做 foo bar 0 这似乎是
  • 了解Android联系人的架构

    我正在开发一个 Android 应用程序 它需要知道何时添加 更新 删除联系人 所以我读了几篇文章 据我所知 每当联系人发生更改时 我们都可以通过内容观察者收到通知 但我们无法获取已添加 更新 删除的联系人 因此 我阅读了官方 API 并准