【问题标题】:shared preferences problem共享偏好问题
【发布时间】:2011-03-09 17:47:49
【问题描述】:

我在将变量放入共享首选项时遇到问题。我从联系人选择器中获取联系人 ID、姓名和号码,然后将它们保存到共享首选项中,以便我可以在另一个活动中使用它们来放入数据库,但每次我去让它们进入另一个活动时,它都会给我询问姓名或身份证时的电话号码??

即。联系信息活动

id "displays the id"
name "displays name"
phone "displays phone"

第二次活动

id "displays phone number"
name "displays phone number"
phone "displays phone number"

没听懂?

这是我的代码

偏好类

public class SmsPrefs extends PreferenceActivity {

public static final String ID = "";
public static final String NAME = "";
public static final String NUMBER = "";

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.sms_pref);
}

}

获取联系信息 sn-p

    public void getContactData(Intent data){
    Context context = this;

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = pref.edit();
    ContentResolver cr = getContentResolver();
    Uri contactData = data.getData();
    Log.v("Contact", contactData.toString());
    Cursor c = managedQuery(contactData,null,null,null,null);

    if(c.moveToFirst()){
            id = contactData.getLastPathSegment();
            editor.putString(SmsPrefs.ID, id);
            editor.commit();
        Log.v("Contact", "ID: " + id.toString());
            name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            editor.putString(SmsPrefs.NAME, name);
            editor.commit();
        Log.v("Contact", "Name: " + name.toString());

        if (Integer.parseInt(c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                Cursor pCur = cr.query(Phone.CONTENT_URI,null,Phone.CONTACT_ID +" = ?", new String[]{id}, null);
                if(pCur.moveToFirst()){
              phone = pCur.getString(pCur.getColumnIndex(Phone.NUMBER));
              editor.putString(SmsPrefs.NUMBER, phone);
              editor.commit();
              Log.v("Contact", "Phone Number: " + phone.toString());
                }
          pCur.close();
      }
    }
    c.close();
}

如果我在此活动中从共享偏好中获得 3 个值,我会得到正确的值

第二个活动sn-p

ok.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            String name = new String ("name");
            String id = new String ("id");
            String phone = new String ("number");

            SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(v.getContext());

            id = pref.getString(SmsPrefs.ID, "");
            name = pref.getString(SmsPrefs.NAME, "");
            phone = pref.getString(SmsPrefs.NUMBER, "");

            Log.v("EditContact", "ID: " + id);
            Log.v("EditContact", "Name: " + name);
            Log.v("EditContact", "Phone: " + phone);

            db.open();
            db.deleteContact(7);
            db.close();

            db.open();
            long _id;
            _id = db.insertContact(phone, name, nColor, nVibrate, ringTonePath);
            db.close();
            Log.v("EditContact", "ID: " + _id);
            Intent ok = new Intent(EditContact.this,Contacts.class);
            startActivity(ok);
        }
    });

当我只使用它们 2 次时,我不明白它是如何变化的

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

    我猜你的 SmsPrefs.ID.NAME.NUMBER 是相同的值。它们需要不同,否则它们会相互覆盖。

    你可以:

    • 更改写入数据的顺序,将电话号码写入姓名和 ID 之前。这应该会改变您的结果并确认问题。
    • 在调试器中单步调试应用以查看这些常量的实际值是什么
    • 发布您的SmsPrefs 代码供我们调查。

    尝试将您的 SmsPrefs 常量更改为:

    public static final String ID = "com.example.SmsPrefs.ID";
    public static final String NAME = "com.example.SmsPrefs.NAME";
    public static final String NUMBER = "com.example.SmsPrefs.NUMBER";
    

    您的密钥实际上必须彼此不同。

    【讨论】:

    • 对不起,我忘了放我的 smsprefs 但它现在在上面
    【解决方案2】:
    public static final String ID = "";
    public static final String NAME = "";
    public static final String NUMBER = "";
    

    这些需要设置为:

    public static final String ID = "_id";
    public static final String NAME = "_name";
    public static final String NUMBER = "_number";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2021-12-09
      • 2016-06-13
      • 2015-11-07
      相关资源
      最近更新 更多