2014-07-03 57 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友好模式。