Android 共享偏好问题
我在将变量放入共享首选项时遇到问题。我从联系人选取器中获取联系人id、姓名和号码,然后将其保存到共享首选项中,这样我就可以在另一个活动中使用它们来放入数据库中,但每次我在另一个活动中获取联系人id时,当我询问姓名或id时,它都会给我电话号码 即联系信息活动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 "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";
对不起,我忘了挂我的短信,但它现在在上面