나는 "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());
당신의 코드를 보여 주시겠습니까 "다른 현에 넣어"여기 코드는? –
수정 됨이게 도움이 될 것 같아요. – Ashish
그래서 각 개체의 유형을 확인해야합니까? 더 나은 옵션이 있습니까? 어쩌면 XML 태그 대신 다 처리 할 수 있을까요? –