Android에서 클래스의 객체를 공유 환경 설정에 저장하고 나중에 객체를 검색 할 수 있습니까?
가능하다면 어떻게해야합니까? 가능하지 않다면 다른 가능성은 무엇입니까?
직렬화가 하나의 옵션이라는 것을 알고 있지만 공유 기본 설정을 사용하여 가능성을 찾고 있습니다.
Android에서 클래스의 객체를 공유 환경 설정에 저장하고 나중에 객체를 검색 할 수 있습니까?
가능하다면 어떻게해야합니까? 가능하지 않다면 다른 가능성은 무엇입니까?
직렬화가 하나의 옵션이라는 것을 알고 있지만 공유 기본 설정을 사용하여 가능성을 찾고 있습니다.
답변:
예, 다음을 사용하여 수행 할 수 있습니다. Gson을
GitHub 에서 작업 코드 다운로드
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
저장을 위해
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject); // myObject - instance of MyObject
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
얻기 위해
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
최신 버전의 GSON은 github.com/google/gson 에서 다운로드 할 수 있습니다. .
Gradle / Android Studio를 사용하는 경우 build.gradle
종속성 섹션 에 다음을 입력 하십시오.
implementation 'com.google.code.gson:gson:2.6.2'
String json = gson.toJson("MyObject");
문자열이 아닌 객체 여야합니다.
Outputstream을 사용하여 Object를 내부 메모리로 출력 할 수 있습니다. 그리고 문자열로 변환 한 다음 기본 설정에 저장합니다. 예를 들면 :
mPrefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor ed = mPrefs.edit();
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutput;
try {
objectOutput = new ObjectOutputStream(arrayOutputStream);
objectOutput.writeObject(object);
byte[] data = arrayOutputStream.toByteArray();
objectOutput.close();
arrayOutputStream.close();
ByteArrayOutputStream out = new ByteArrayOutputStream();
Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);
b64.write(data);
b64.close();
out.close();
ed.putString(key, new String(out.toByteArray()));
ed.commit();
} catch (IOException e) {
e.printStackTrace();
}
Preference에서 Object를 추출해야 할 때. 아래와 같이 코드를 사용하십시오.
byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();
if (bytes.length == 0) {
return null;
}
ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);
ObjectInputStream in;
in = new ObjectInputStream(base64InputStream);
MyObject myObject = (MyObject) in.readObject();
나는 같은 문제가 있었고 여기 내 해결책이 있습니다.
공유 기본 설정에 저장하려는 MyClass 및 ArrayList <MyClass> 클래스가 있습니다. 처음에는 JSON 객체로 변환하는 메서드를 MyClass에 추가했습니다.
public JSONObject getJSONObject() {
JSONObject obj = new JSONObject();
try {
obj.put("id", this.id);
obj.put("name", this.name);
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
다음은 "ArrayList <MyClass> items"개체를 저장하는 방법입니다.
SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
SharedPreferences.Editor editor = mPrefs.edit();
Set<String> set= new HashSet<String>();
for (int i = 0; i < items.size(); i++) {
set.add(items.get(i).getJSONObject().toString());
}
editor.putStringSet("some_name", set);
editor.commit();
객체를 검색하는 방법은 다음과 같습니다.
public static ArrayList<MyClass> loadFromStorage() {
SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
ArrayList<MyClass> items = new ArrayList<MyClass>();
Set<String> set = mPrefs.getStringSet("some_name", null);
if (set != null) {
for (String s : set) {
try {
JSONObject jsonObject = new JSONObject(s);
Long id = jsonObject.getLong("id"));
String name = jsonObject.getString("name");
MyClass myclass = new MyClass(id, name);
items.add(myclass);
} catch (JSONException e) {
e.printStackTrace();
}
}
return items;
}
Shared Preferences의 StringSet은 API 11부터 사용할 수 있습니다.
Gson 라이브러리 사용 :
dependencies {
compile 'com.google.code.gson:gson:2.8.2'
}
저장:
Gson gson = new Gson();
//Your json response object value store in json object
JSONObject jsonObject = response.getJSONObject();
//Convert json object to string
String json = gson.toJson(jsonObject);
//Store in the sharedpreference
getPrefs().setUserJson(json);
검색:
String json = getPrefs().getUserJson();
PowerPreference
라이브러리를 사용하여 3 단계로 쉽게 할 수 있습니다 !
https://github.com/AliAsadi/PowerPreference
Object obj = new Object();
PowerPreference.getDefaultFile().put("object",obj);
Object obj = PowerPreference.getDefaultFile()
.getObject("object", Object.class);
이 객체-> TinyDB--Android-Shared-Preferences-Turbo를 사용 하면 매우 간단합니다. 배열, 정수, 문자열 목록 등과 같이 일반적으로 사용되는 대부분의 객체를 저장할 수 있습니다.
당신이 사용할 수있는 펠리페 실베스트르에 의해 - 복잡한 환경 설정 안드로이드를 사용자 정의 개체를 저장하는 라이브러리입니다. 기본적으로 GSON 메커니즘을 사용하여 객체를 저장합니다.
개체를 환경 설정에 저장하려면 :
User user = new User();
user.setName("Felipe");
user.setAge(22);
user.setActive(true);
ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(
this, "mypref", MODE_PRIVATE);
complexPreferences.putObject("user", user);
complexPreferences.commit();
다시 검색하려면 :
ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", MODE_PRIVATE);
User user = complexPreferences.getObject("user", User.class);
Gradle Build.gradle을 사용하여 GSON을 사용할 수 있습니다.
implementation 'com.google.code.gson:gson:2.8.0'
그런 다음 코드에서, 예를 들어 Kotlin과 문자열 / 부울 쌍이 있습니다.
val nestedData = HashMap<String,Boolean>()
for (i in 0..29) {
nestedData.put(i.toString(), true)
}
val gson = Gson()
val jsonFromMap = gson.toJson(nestedData)
SharedPrefs에 추가 :
val sharedPrefEditor = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE).edit()
sharedPrefEditor.putString("sig_types", jsonFromMap)
sharedPrefEditor.apply()
이제 데이터를 검색합니다.
val gson = Gson()
val sharedPref: SharedPreferences = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE)
val json = sharedPref.getString("sig_types", "false")
val type = object : TypeToken<Map<String, Boolean>>() {}.type
val map = gson.fromJson(json, type) as LinkedTreeMap<String,Boolean>
for (key in map.keys) {
Log.i("myvalues", key.toString() + map.get(key).toString())
}
CURD (Common Shared Preferences) SharedPreference : 간단한 Kotlin 클래스를 사용하여 값-키 쌍 형식으로 데이터를 저장합니다.
var sp = SharedPreference(this);
데이터 저장 :
String, Int 및 Boolean 데이터를 저장하기 위해 이름이 같고 매개 변수가 다른 세 가지 메서드가 있습니다 (메소드 오버로딩).
save("key-name1","string value")
save("key-name2",int value)
save("key-name3",boolean)
데이터 검색 : SharedPreferences에 저장된 데이터를 검색하려면 다음 방법을 사용하십시오.
sp.getValueString("user_name")
sp.getValueInt("user_id")
sp.getValueBoolean("user_session",true)
모든 데이터 지우기 : 전체 SharedPreferences를 지우려면 아래 코드를 사용하십시오.
sp.clearSharedPreference()
특정 데이터 제거 :
sp.removeValue("user_name")
공통 공유 선호 클래스
import android.content.Context
import android.content.SharedPreferences
class SharedPreference(private val context: Context) {
private val PREFS_NAME = "coredata"
private val sharedPref: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
//********************************************************************************************** save all
//To Store String data
fun save(KEY_NAME: String, text: String) {
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putString(KEY_NAME, text)
editor.apply()
}
//..............................................................................................
//To Store Int data
fun save(KEY_NAME: String, value: Int) {
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putInt(KEY_NAME, value)
editor.apply()
}
//..............................................................................................
//To Store Boolean data
fun save(KEY_NAME: String, status: Boolean) {
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putBoolean(KEY_NAME, status)
editor.apply()
}
//********************************************************************************************** retrieve selected
//To Retrieve String
fun getValueString(KEY_NAME: String): String? {
return sharedPref.getString(KEY_NAME, "")
}
//..............................................................................................
//To Retrieve Int
fun getValueInt(KEY_NAME: String): Int {
return sharedPref.getInt(KEY_NAME, 0)
}
//..............................................................................................
// To Retrieve Boolean
fun getValueBoolean(KEY_NAME: String, defaultValue: Boolean): Boolean {
return sharedPref.getBoolean(KEY_NAME, defaultValue)
}
//********************************************************************************************** delete all
// To clear all data
fun clearSharedPreference() {
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.clear()
editor.apply()
}
//********************************************************************************************** delete selected
// To remove a specific data
fun removeValue(KEY_NAME: String) {
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.remove(KEY_NAME)
editor.apply()
}
}
블로그 : https://androidkeynotes.blogspot.com/2020/02/shared-preference.html
응용 프로그램이 종료 된 후에도 또는 실행중인 동안에도 개체를 검색해야합니까?
데이터베이스에 저장할 수 있습니다.
또는 단순히 사용자 정의 애플리케이션 클래스를 생성하십시오.
public class MyApplication extends Application {
private static Object mMyObject;
// static getter & setter
...
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application ... android:name=".MyApplication">
<activity ... />
...
</application>
...
</manifest>
그리고 모든 활동에서 다음을 수행합니다.
((MyApplication) getApplication).getMyObject();
정말 최선의 방법은 아니지만 작동합니다.