1

在我正在开发的 Android 应用程序中,我有一个用于映射的数据库:

<联系人 ID,联系人查找键> --> <与联系人关联的我的自定义数据>

当收到 SMS 消息时,我希望能够查找与发送 SMS 消息的联系人关联的联系人关联的自定义数据。我想以尽可能少的步骤进行查找。

我可以从 SMS 消息中获取的唯一数据是电话号码,所以问题基本上是在尽可能少的步骤中将电话号码映射到与联系人关联的我的自定义数据。

现在,我知道我可以使用ContactsContract.PhoneLookup从电话号码中查找联系人,如此所述。但是,这并没有让我得到我想要的结果,因为联系人 ID 和联系人查找密钥都可能发生变化。因此,如果我保存到数据库中的任何联系人的 ID 或查找键发生了变化,我基本上必须加载我的整个数据库并刷新每一行的 ID/查找键,然后才能测试它们是否代表相同的联系人ContactsContract.PhoneLookup 返回的那个。这是一个非常残酷的解决方案,我宁愿避免。

我想做的是保留一个表格,将电话号码映射到我的自定义数据(在 N:1 关系中)。

<电话号码> --> <与联系人关联的我的自定义数据>

这样,至少在理论上,我可以索引电话号码列并一步查找数据。但是,电话号码有多种格式。只有当我可以创建给定电话号码的规范表示时,我的解决方案才有效。我的计划是使用PhoneNumberUtils.getStrippedReversed来生成一个有效的可索引规范电话号码,但这在一个微不足道的情况下会失败,例如:

PhoneNumberUtils.getStrippedReversed("+1(306)6656320") --> 02365566031 PhoneNumberUtils.getStrippedReversed("(306)6656320") --> 0236556603

他们不是同一个数字!

因此,通过冗长的解释,我的问题是:任何人都可以想出一种将电话号码转换为规范电话号码的方法,以便我可以对号码执行索引数据库查找,或任何其他解决方案我上面描述的问题?

4

1 回答 1

1

您可以将以下方法与 getStrippedReversed 一起使用

public static String toCallerIDMinMatch (String phoneNumber)

*以相反的顺序返回网络部分中最右边的 MIN_MATCH (5) 个字符这可用于对存储 getStrippedReversed() 的列进行数据库查找 如果 phoneNumber == null 则返回 null *

然后你的比较会给你想要的结果

于 2013-02-06T10:30:43.893 回答