Android-Contacts和表连接根本不可能?

时间:2017-03-05 23:12:09

标签: android sqlite listview android-contacts android-cursorloader

目前我正在开发Android操作系统的拨号应用程序。

它显示了ListView中的callogs和联系人。 SearchView用于通过以下方式搜索联系人:姓氏,姓名,昵称及其所有号码。如果搜索字符串表示四种密钥类型的子字符串,则该列表应缩小为匹配的条目。

我正在使用CursorAdapter和CursorLoader来填充列表。 这对于性能而言非常重要。 直到这一点,一切都在运作,绝对清晰。

现在出现问题: 我需要从默认联系人db(contacts2.db)加入2-3个表, 在一个单一的SQL查询中。 所以我的应用程序不应该使用它自己的私有数据库。 但是现有的ContentProviders不提供对多个表的访问。 - >问题!

实现我自己的ContentProvider,可以使用SQLiteQueryBuilder进行联接。 但是第一眼看来似乎只适用于私人数据库。 当我尝试直接访问位于以下位置的contacts2.db时:

/data/data/com.android.providers.contacts/databases/contacts2.db

我收到以下错误:

Failed to open database '/data/data/com.android.providers.contacts/databases/contacts2.db'.
                                 android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14): Could not open database, (OS error - 13:Permission denied)

以某种方式预期,因为每个应用程序都有自己的存储空间,在底层的linux文件系统中使用适当的uid。

那么,我怎样才能获得对这个数据库的读访问权限? 我可以从android系统或使用Context对象以某种方式请求db-object吗?或者我可以以某种方式获得这些访问权限吗?

是否可以使用与联系人应用相同的AUTHOTITY_NAME?像这样:

com.android.providers.contacts
  • 我对使用java代码加入列感兴趣,那是UGLY,非常慢,而且我需要一个Cursor而不是List或类似的东西
  • 我在SQL中不需要帮助
  • 我在如何实现android的东西方面不需要帮助

所有Android-Pros都在那里 - 这可能吗? 或者android api真的很糟糕吗? 我真的必须通过使用CursorJoiner“生成”来加入所需的信息 不知何故,来自第一个的Cursor对象?

非常感谢你们,伙计们!

2 个答案:

答案 0 :(得分:1)

你不是。您甚至不能假设这是给定设备上的联系人db的名称。在所有设备上访问联系人数据库的唯一方法是使用ContentResolver。

答案 1 :(得分:0)

听起来好像您正在寻找Match a Contact By Any Type of Data官方Android课程所示的SQL。 您需要遵循所有4个步骤:

  

请求读取提供者的权限
  按名称匹配联系人并列出结果
  通过特定类型的数据匹配联系人
  按任意类型的数据匹配联系人

因为4步是基于前面步骤创建的代码。

基本上,它在Android的联系人框架中使用了内置搜索功能:Retrieving a List of Contacts

  

使用Contacts.CONTENT_FILTER_URI作为基本URI,并附加您的   通过调用Uri.withAppendedPath()来搜索字符串。使用此URI   自动触发搜索任何数据类型