2016-08-29 5 views
0

나는 "PreferenceManager.getDefaultSharedPreferences (...);"를 통해이 개 된 SharedPreferences 파일을 하나 생성했다 세웠 한 를 통해 getSharedPreferences (someString, Context.MODE_PRIVATE) "나는 키가 독특한 것을 알고 두.가 다른 하나 개의 파일에서 모든 키를 & 값을 이동하는 데 걸리는 무엇? 2 개의 SharedPreferences를 하나로 병합하는 방법은 무엇입니까?

그들 모두를 이동하는 쉬운 방법이 있나요

?

내가 유사한 코드를 사용하여 생각하고 있었는데 this answer 거기에있는 각 가치의 유형을 고려해야합니까?

편집 :

이 그것을 할 수있는 한 가지 방법이 있지만, 새로운 유형이 지원되지 않습니다 의미 미래에 된 SharedPreferences에 추가 할 수 있습니다로는 조금 안전하지 않은 :

 final Editor edit = targetSharedPreferences.edit(); 
     final Map<String, ?> srcSharedPreferenceAll = srcSharedPreference.getAll(); 
     for (final Entry<String, ?> entry : srcSharedPreferenceAll.entrySet()) { 
      if (entry.getValue() instanceof Integer) 
       edit.putInt(entry.getKey(), (Integer) entry.getValue()); 
      else if (entry.getValue() instanceof Boolean) 
       edit.putBoolean(entry.getKey(), (Boolean) entry.getValue()); 
      else if (entry.getValue() instanceof Long) 
       edit.putLong(entry.getKey(), (Long) entry.getValue()); 
      else if (entry.getValue() instanceof String) 
       edit.putString(entry.getKey(), (String) entry.getValue()); 
      else if (entry.getValue() instanceof Float) 
       edit.putFloat(entry.getKey(), (Float) entry.getValue()); 
      else if (entry.getValue() instanceof Set<?>) 
       edit.putStringSet(entry.getKey(), (Set<String>) entry.getValue()); 
     } 
     edit.apply(); 
     srcSharedPreference.edit().clear().apply(); 

하나의 SharedPreference 파일에서 다른 태그로 XML 태그를 복사하는 데 성공했지만 어떤 이유로 인해 다음 세션의 SharedPreference 객체에서만 인식되며 현재 세션 (아마도 캐시 된 것)이 아닌 것으로 나타납니다.

private static final String DST_XML_FILE = "dst"; 

    // creating the data, for reading&writing later: 
    final SharedPreferences srcSharedPreference = getSharedPreferences(String , Context.MODE_PRIVATE); 
    srcSharedPreference.edit().clear().putInt("someInt", 12).putString("someString", "hi").putBoolean("someBoolean", true).apply(); 
    final SharedPreferences targetSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
    targetSharedPreferences.edit().clear().putInt("someInt2", 23).putString("someString2", "hi there").putBoolean("someBoolean2", false).apply(); 

    //checking content before 
    Log.d("AppLog", "before"); 
    final Map<String, ?> src = srcSharedPreference.getAll(); 
    Log.d("AppLog", "src:" + src.size()); 
    final Map<String, ?> targetSharedPreferencesAll = targetSharedPreferences.getAll(); 
    Log.d("AppLog", "target:" + targetSharedPreferencesAll.size()); 

    // the moving of the XML tags: 
    final PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); 
    File dstFile = new File(packageInfo.applicationInfo.dataDir, "shared_prefs/" + (VERSION.SDK_INT >= VERSION_CODES.N ? PreferenceManager.getDefaultSharedPreferencesName(this) : getPackageName() + "_preferences") + ".xml"); 
    File srcFile = new File(packageInfo.applicationInfo.dataDir, "shared_prefs/" + SRC_XML_FILE + ".xml"); 

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
    Node srcNode = docFactory.newDocumentBuilder().parse(srcFile).getFirstChild(); 
    Node dstNode = docFactory.newDocumentBuilder().parse(dstFile).getFirstChild(); 
    final NodeList childNodes = srcNode.getChildNodes(); 
    for (int i = 0; i < childNodes.getLength(); ++i) { 
     final Node item = childNodes.item(i); 
     Node importedNode = dstNode.getOwnerDocument().importNode(item, true); 
     srcNode.removeChild(item); 
     dstNode.appendChild(importedNode); 
    } 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    DOMSource source = new DOMSource(dstNode); 
    StreamResult result = new StreamResult(dstFile); 
    transformer.transform(source, result); 

    //checking content after 
    Log.d("AppLog", "after"); 
    final Map<String, ?> src = srcSharedPreference.getAll(); 
    Log.d("AppLog", "src:" + src.size()); 
    final Map<String, ?> targetSharedPreferencesAll = targetSharedPreferences.getAll(); 
    Log.d("AppLog", "target:" + targetSharedPreferencesAll.size()); 

답변

1
Map<String,?> keys = prefs.getAll(); 
for(Map.Entry<String,?> entry : keys.entrySet()){ 
     Object o = keys.get(entry); 
     if (o instanceof Boolean) 
     { 
      pref2.putBoolean(o); 
     } 
     if (o instanceof String) 
     { 
      pref2.putString(o); 
     } 
     ... 
    } 
} 
+0

당신의 코드를 보여 주시겠습니까 "다른 현에 넣어"여기 코드는? –

+0

수정 됨이게 도움이 될 것 같아요. – Ashish

+0

그래서 각 개체의 유형을 확인해야합니까? 더 나은 옵션이 있습니까? 어쩌면 XML 태그 대신 다 처리 할 수 ​​있을까요? –

관련 문제