2014-07-03 52 views
2

在我的应用程序中,我需要将值保存到Sharedpreferences文件RKs_Data中而不覆盖现有数据。每一次,我在我的应用程序中点击“是”,我需要将所有值存储在“RKs_Data”中,而不是仅仅将最新的“名称”和“phoneNo”存入文件。将更多值添加到共享首选项而不是覆盖现有值

  1. 是否可以通过SharedPreferences来实现?如果是,如何?
  2. 如果不是,下一步我有什么更好的选择来实现呢?

对于例如,

  • 当我第一次点击,如“布莱恩”的联系人之一,它在SharedPreferences两者的姓名和电话为 布赖恩和99999299999节约与第一保存在共享偏好文件'RKS_Data'
  • 当我点击其他联系人说 '莫奈',我RKs_Data应该出现这样的:

    1. 布赖恩99999299999
    2. 莫奈000.1亿 等等....

我搜索了,但到处是只提到有关保存它,但没有关于追加或与数据做一些操作...

请指导...

片段是象下面这样:

------- 
    public class RKsContacts_Main extends ListActivity { 

    // private ListView listView; 
    private List<ContactBean> list = new ArrayList<ContactBean>(); 
    SharedPreferences sp; 
    File Fav_Contacts_file; 
    String contact = null; 
    List<String> listOfFavoritePhrases = new ArrayList<String>(); 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.rks_contactslist_main); 
     ListView listview = getListView(); 

     sp = getSharedPreferences("PACKAGE", Context.MODE_PRIVATE); 
------- 

-------- 
@Override 
      public void onClick(DialogInterface dialog, int which) { 

       String serialized = sp.getString("phrases", null); 
       listOfFavoritePhrases = new ArrayList<String>(Arrays.asList(TextUtils.split(serialized, ","))); // Line 141 

       listOfFavoritePhrases.add(name); 
       listOfFavoritePhrases.add(phoneNo); 

       SharedPreferences.Editor editor = sp.edit(); 
       editor.putString("phrases",TextUtils.join(",", listOfFavoritePhrases)); 

       editor.commit(); 

      } 
     }); 
     alert.show(); 
    } 
-------- 
低于10

logcat的:

07-03 09:00:51.014: E/AndroidRuntime(9574): FATAL EXCEPTION: main 
07-03 09:00:51.014: E/AndroidRuntime(9574): Process: com.example.rkscontacts_list, PID: 9574 
07-03 09:00:51.014: E/AndroidRuntime(9574): java.lang.NullPointerException 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at android.text.TextUtils.split(TextUtils.java:332) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at com.example.rkscontacts_list.RKsContacts_Main$4.onClick(RKsContacts_Main.java:141) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at android.os.Handler.dispatchMessage(Handler.java:102) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at android.os.Looper.loop(Looper.java:136) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at java.lang.reflect.Method.invoke(Method.java:515) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
07-03 09:00:51.014: E/AndroidRuntime(9574):  at dalvik.system.NativeStart.main(Native Method) 

回答

7

遵循以下步骤:

提取存储在SharedPreferences

String value = prefs.getString(<Key>, <DefaultValue>); 

附加到所提取的值

String appendedValue = append(value, newValue); 

值将结果写回SharedPreferences

editor.putString(<Key>, appendedValue).commit(); 
+0

你可以帮助我在上述步骤的示例代码...? –

+1

查看更新的答复 –

+0

我已经更新了我的问题,并提供了更多详细信息,同时我也在处理您的建议 –

2

你可以CSV格式化你的共享偏好数据。 例如,从共享首选项获取CSV字符串并将其添加到列表中。追加到您的列表中,然后将其放回到您的共享预设中。代码示例

//初始化字符串列表在什么地方

List<String> listOfFavoritePhrases = new ArrayList<String>(); 

//你更改回来后,以CSV格式将数据添加到列表

listOfFavoritePhrases.add("Brian|99999299999"); 
listOfFavoritePhrases.add("Monet|00010000000"); 

//把字符串列表

SharedPreferences prefs = getSharedPreferences("PACKAGE", Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString("phrases",TextUtils.join(",", listOfFavoritePhrases)); 
      editor.commit(); 

//获取数据

 SharedPreferences prefs = getSharedPreferences("PACKAGE", Context.MODE_PRIVATE); 
    String serialized = prefs.getString("phrases", "Brian"); 
    listOfFavoritePhrases = new ArrayList<String>(Arrays.asList(TextUtils.split(serialized, ","))); 

然后

String CurrentString = listOfFavoritePhrases.get(0); // first element 
String[] separated = CurrentString.split("|"); 
Toast.makeText(this, separated[0], Toast.LENGTH_LONG).show(); // brian 
Toast.makeText(this, separated[1], Toast.LENGTH_LONG).show(); // 99999299999 

希望这有助于。

+0

我在行上得到了nullPointerException:列表 listOfFavoritePhrases = new ArrayList (Arrays.asList(TextUtils.split(serialized,“,”)) );任何建议请.. –

+0

我认为你需要初始化listOfFavoritePhrases之前。我将编辑我的答案 – mnaa

+0

它仍然是一样的。我更新了上面编辑过的最新代码,我知道发生了一些愚蠢的事情。请看一看。让我知道是否需要其他代码片段。 –

1

最后我的代码看起来是这样的:共享最后的代码,因为它可以给别人谁是新手我一样:)


protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.rks_contactslist_main); 
     ListView listview = getListView(); 

     sp = getSharedPreferences("PACKAGE", Context.MODE_PRIVATE); 
     String str = sp.getString("FAV_CONTACS", 
       "NO fav contacts are saved as of now"); 
--------- 

protected void onListItemClick(ListView listview, View view, int position, 
      long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(listview, view, position, id); 
     ContactBean bean = (ContactBean) listview.getItemAtPosition(position); 

     showCallDialog(bean.getName(), bean.getPhoneNo()); 
    } 


--------- 

    public void onClick(DialogInterface dialog, int which) { 
       Fav_Contacts_file = getFilesDir(); 
        if (count <5) { 
         SharedPreferences.Editor editor = sp.edit(); 

         String new_contact = name + " " + phoneNo; 


         String existing_contact = sp.getString("CONTACTS", ""); 
         /*String existing_phone = sp.getString("phoneNo", ""); 
         String existing_contact = existing_name + " " +existing_phone ;*/ 


         String latestfavContacts = append(existing_contact, new_contact); 


         editor.putString("CONTACTS", latestfavContacts); 
         editor.commit(); 
         count++; 
         Toast.makeText(
           getApplicationContext(), 
           "The data saved successfully to ........ : " 
             + Fav_Contacts_file + "/PACKAGE", 
           Toast.LENGTH_SHORT).show(); 
         Toast.makeText(
           getApplicationContext(), 
           "Name : " + name + " and Phone : " 
             + phoneNo, Toast.LENGTH_SHORT) 
           .show(); 
        } 
        else { 
         Toast.makeText(
           getApplicationContext(), 
           "More than 5 Fav Contacts are NOT allowed",          
           Toast.LENGTH_SHORT).show(); 
        } 

       } 
      }); 
      alert.show(); 
     } 

     protected String append(String existing_contact, String new_contact) { 
      String latestfavContacts = existing_contact + " | "+ new_contact ; 
      return latestfavContacts; 
     } 

有用的,并存储在SharedPreference文件“PACAKAGE”长相数据像这样:

<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
-<map> 
<string name="CONTACTS"> | Alen 1 231-231-231 | Alex Zun 1 234-321-231 | Dr. S.K. Taher Ali 040-7265587 | Gazer 1 312-345-452 | Helen (432) 341-1343</string> 
</map> 

我还没有工作的格式,并根据我的应用程序需要提交给UI友好模式。