Android 共享偏好问题

Android 共享偏好问题,android,sharedpreferences,Android,Sharedpreferences,我在将变量放入共享首选项时遇到问题。我从联系人选取器中获取联系人id、姓名和号码,然后将其保存到共享首选项中,这样我就可以在另一个活动中使用它们来放入数据库中,但每次我在另一个活动中获取联系人id时,当我询问姓名或id时,它都会给我电话号码 即联系信息活动 id "displays the id" name "displays name" phone "displays phone" 第二项活动 id "displays phone number" name "displays phone n

我在将变量放入共享首选项时遇到问题。我从联系人选取器中获取联系人id、姓名和号码,然后将其保存到共享首选项中,这样我就可以在另一个活动中使用它们来放入数据库中,但每次我在另一个活动中获取联系人id时,当我询问姓名或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);
}
}

获取联系人信息片段

    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个值,我将获得正确的值

第二个活动片段

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);
        }
    });

我不明白它是如何变化的,当我只使用了两次时,我猜你的
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";
你的钥匙实际上必须彼此不同

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";

对不起,我忘了挂我的短信,但它现在在上面