通过内容提供商启动新的会话线程

时间:2013-06-13 18:01:15

标签: java android sms android-contentprovider

在开始之前,我知道SMS内容提供商没有记录。我知道不建议使用它。

因为无论如何我都在使用它,我希望有一些帮助实现我的目标之一。 我目前能够毫无问题地添加和删除邮件。在我删除整个线程并尝试恢复它之后,问题出现了。消息在数据库中,(如果我再次尝试添加它们,我会收到错误,

android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19)

所以我知道消息就在那里。)但如果我打开一个消息应用程序,它们就不会显示。

如果我从线程中删除了除一条消息之外的所有消息,则恢复的消息会在其线程中显示回来。关于为什么我无法创建新消息线程的任何想法?

Uri allSmsUri = Uri.parse("content://sms/");

getContentResolver().delete(allSmsUri, "_id = ?", new String[] { m.get_id() });

        ContentValues values = new ContentValues();
        values.put("person", m.getPerson());
        values.put("_id", m.get_id());
        values.put("thread_id", m.getThread_id());
        values.put("body", m.getBody());
        values.put("address", m.getAddress());
        values.put("read", m.getRead());
        values.put("date", m.getDate());
        values.put("type", m.getType());
        values.put("date_sent", m.getDate_sent());
        values.put("protocol", m.getProtocol());
        values.put("status", m.getStatus());
        values.put("reply_path_present", m.getreply_path_present());
        values.put("subject", m.getSubject());
        values.put("service_center", m.getservice_center());
        values.put("locked", m.getLocked());
        values.put("error_code", m.getError_code());
        values.put("seen", m.getSeen());

getContentResolver().insert(allSmsUri, values);

1 个答案:

答案 0 :(得分:1)

可能是因为当您“删除”消息线程时,它在SMS内部标记为已删除,但实际上并未从底层数据库中删除。当您尝试将线程添加回提供程序时,_ID值与仍在数据库中的行冲突。

一般情况下,这是一个非常(“坏坏坏坏坏,不好” - Detritus,巨魔, Men At Arms )插入或删除的想法来自捆绑内容提供商的数据使用ContentResolver方法。几乎所有这些内容提供商都有一个复杂的内部状态管理系统,如果你试图“推动自己的”流程,你必然会搞砸。

相反,你应该坚持使用意图进行插入和删除。好处是:

  • 包含内容提供商的捆绑应用程序会为您处理状态管理。
  • 你不能通过尝试做一些提供者不支持的事情来犯错误
  • 您获得修改提供程序的临时权限,因此您无需请求 您自己的应用程序的权限。像这样的用户。

如果您必须自己动手,请仔细阅读文档,包括javadoc。如果你没有看到问题的答案,你应该假设有人故意不要你做某事。您可以自由阅读开源,但您可以自己阅读。

我是否还必须指出,使用未记录的,不受支持的API可确保您的应用在将来中断?