目前我正在开发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
所有Android-Pros都在那里 - 这可能吗? 或者android api真的很糟糕吗? 我真的必须通过使用CursorJoiner“生成”来加入所需的信息 不知何故,来自第一个的Cursor对象?
非常感谢你们,伙计们!
答案 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 自动触发搜索任何数据类型