Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过内容提供商启动新的对话线程_Java_Android_Sms_Android Contentprovider - Fatal编程技术网

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

Java 通过内容提供商启动新的对话线程,java,android,sms,android-contentprovider,Java,Android,Sms,Android Contentprovider,在我们开始之前,我知道SMS内容提供商没有文档记录。我知道不推荐使用它 因为我一直在使用它,所以我想得到一些帮助来实现我的一个目标。 我目前可以添加和删除邮件,没有问题。在我删除整个线程并尝试恢复它之后,问题出现了。这些消息在数据库中,(如果我再次尝试添加它们,会出现错误 android.database.sqlite.SQLiteConstraintException:主键必须唯一(代码19) 所以我知道信息就在那里。)但是如果我打开一个信息应用程序,它们就不会显示 如果我从线程中删除除一条

在我们开始之前,我知道SMS内容提供商没有文档记录。我知道不推荐使用它

因为我一直在使用它,所以我想得到一些帮助来实现我的一个目标。 我目前可以添加和删除邮件,没有问题。在我删除整个线程并尝试恢复它之后,问题出现了。这些消息在数据库中,(如果我再次尝试添加它们,会出现错误

android.database.sqlite.SQLiteConstraintException:主键必须唯一(代码19)

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

如果我从线程中删除除一条消息以外的所有消息,则恢复的消息将很好地显示在其线程中。关于我无法创建新消息线程的原因,有什么想法吗

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

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

一般来说,使用ContentResolver方法插入或删除捆绑内容提供商的数据是一个非常糟糕的想法(“坏,不好”-Crattus,TheTroll,Men At Arms)。几乎所有这些内容提供商都有一个复杂的内部状态管理系统,如果您试图“滚动您自己的”流程,您肯定会搞砸

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

  • 包含内容提供商的捆绑应用程序为您处理状态管理
  • 如果你试图做一些提供商不支持的事情,你就不会犯错误
  • 您可以获得修改提供程序的临时权限,因此不必请求 在您自己的应用程序中的权限。用户喜欢这样
如果您必须自己动手,那么请仔细阅读文档,包括javadoc。如果你看不到问题的答案,你应该假设有人故意不让你做某事。您可以自由阅读开放源码,但只能靠自己


我还必须指出,使用未记录的、不受支持的API会保证你的应用程序在将来会崩溃吗?

我很清楚它的缺点,这就是我提到它的原因。目前没有办法实现我试图用intent系统做的事情。我知道这是可能的,这个应用程序做它,做它(AFAIK)和我一样,插入和删除。
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);