【问题标题】:How many database columns associated with a SMS in android?android中有多少与SMS相关的数据库列?
【发布时间】:2011-04-30 15:24:17
【问题描述】:

我想从我的手机中读取所有消息及其各自的详细信息。 为此,我使用这样的 Uri:

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

但我不知道数据库中有多少列与此 uri 相关联。

我想显示以下信息:

  1. 消息类型
  2. 发件人号码
  3. 消息正文
  4. 时间戳

请问有人能列举出总的列名吗?

【问题讨论】:

    标签: android sms messages


    【解决方案1】:

    包 com.readsms;

    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;
    
    public class ReadSMS extends Activity 
    {
        private static final String tag = "Whozzat";
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Uri sms = Uri.parse("content://sms/inbox");
            ContentResolver cr = this.getContentResolver();
            Cursor c = cr.query(sms, null, null, null, null);
            for (int i = 0; i < c.getColumnCount(); i++)
            {
                Log.v(tag, c.getColumnName(i).toString());
            }
            c.close();
        }
    }
    

    运行此代码 sn-p 后,我得到了以下列:

    【讨论】:

      【解决方案2】:

      您应该能够通过光标旋转并寻找自己:

      mCursor = managedQuery(sms, null, null, null, null);
      
      StringBuffer info = new StringBuffer();
      for( int i = 0; i < mCursor.getColumnCount(); i++) {
          info.append("Column: " + mCursor.getColumnName(i) + "\n");
      }
      Toast.makeText(getApplicationContext(), info.toString(), Toast.LENGTH_LONG).show();
      

      【讨论】:

      • 我花了很多时间使用调试器来找出字段。这非常有用:)
      【解决方案3】:

      content://sms 不是官方 Android API 的一部分,因此使用它不是一个好主意。它可能会停止工作,并且一些使用自己的 SMS 实现的手机(可能是 HTC Sense?)可能有自己的内容提供商,无法使用您的代码。

      也就是说,如果你真的想深入了解它,你可以查看source code

      但同样,请注意这个警告:http://android-developers.blogspot.com/2010/05/be-careful-with-content-providers.html

      【讨论】:

      • 访问 SMS 商店的首选方式应该是什么?我们应该手动创建对话列表吗?
      【解决方案4】:

      试试这个:

      public void showAllCNames (View v){
              Uri uri = Uri.parse("content://sms/");
              final Cursor cur = getContentResolver().query(uri, null, null, null, null);
              for (String s : cur.getColumnNames()){Log.d("COLUMN_NAME", s);}
      }
      

      我浏览了列名并得到了它:

      COLUMN_NAME:_id

      COLUMN_NAME:thread_id

      COLUMN_NAME:地址

      COLUMN_NAME:人

      COLUMN_NAME:日期

      COLUMN_NAME:日期发送

      COLUMN_NAME:sc_timestamp

      COLUMN_NAME:协议

      COLUMN_NAME:读取

      COLUMN_NAME:状态

      COLUMN_NAME:类型

      COLUMN_NAME:reply_path_present

      COLUMN_NAME:主题

      COLUMN_NAME:正文

      COLUMN_NAME:服务中心

      COLUMN_NAME:锁定

      COLUMN_NAME:sub_id

      COLUMN_NAME:错误代码

      COLUMN_NAME:看过

      COLUMN_NAME:lgeMsgType

      COLUMN_NAME:lgeSiid

      COLUMN_NAME:lgeCreated

      COLUMN_NAME:lgeExpires

      COLUMN_NAME:lgeReceived

      COLUMN_NAME:lgeAction

      COLUMN_NAME:lgeSec

      COLUMN_NAME:lgeMac

      COLUMN_NAME:lgeDoc

      COLUMN_NAME:已安装

      COLUMN_NAME:lgePinRemainCnt

      COLUMN_NAME:index_on_icc

      COLUMN_NAME:service_msg_sender_address

      COLUMN_NAME:lgeCallbackNumber

      COLUMN_NAME:sms_imsi_data

      【讨论】:

        【解决方案5】:

        如果您只想知道特定光标中存储的内容,您可以简单地使用DatabaseUtils.dumpCursor(cursor); 在控制台上显示所有带有值的列

        【讨论】:

          【解决方案6】:

          Android 4.4.2 手机 由于这是特定于版本/内容的,因此不要依赖数字索引键

          _id 线程 ID 地址 m_size 人 日期 发送日期 协议 读 状态 类型 reply_path_present 主题 身体 服务中心 锁定 sim_id 错误代码 见过 ipmsg_id

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-07
            • 2018-10-02
            • 1970-01-01
            • 2012-02-09
            • 1970-01-01
            • 2011-04-22
            • 2015-03-27
            • 1970-01-01
            相关资源
            最近更新 更多