IT/Android
[Android] (2) SharedPreferences의 사용 - Kotlin
Hodie!
2021. 7. 26. 07:15
반응형
SharedPreferences 실제 사용
실제 사용 부분은 구글링을 통해 많은 부분 블로그들을 참고하였다.
1. build.gradle/app
implementation 'androidx.preference:preference-ktx:1.1.1'
먼저 build.gradle sync부터 진행해준다
2. PreferenceHelper.kt
object PreferenceHelper {
fun defaultPrefs(context: Context): SharedPreferences =
PreferenceManager.getDefaultSharedPreferences(context)
private inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) {
val editor = this.edit()
operation(editor)
editor.apply()
}
operator fun SharedPreferences.set(key: String, value: Any?) {
when (value) {
is String? -> edit {it.putString(key, value)}
is Int? -> edit {
if (value != null) {
it.putInt(key, value)
}
}
is Boolean? -> edit {
if (value != null) {
it.putBoolean(key, value)
}
}
is Float? -> edit {
if (value != null) {
it.putFloat(key, value)
}
}
is Long? -> edit {
if (value != null) {
it.putLong(key, value)
}
}
else -> throw UnsupportedOperationException("Error")
}
}
@Suppress("UNCHECKED_CAST")
operator fun <T> SharedPreferences.get(key: String, defaultValue: T?= null): T {
return when (defaultValue) {
is String, null -> getString(key, defaultValue as? String) as T
is Int -> getInt(key, defaultValue as? Int ?: -1) as T
is Boolean -> getBoolean(key, defaultValue as? Boolean ?: false) as T
is Float -> getFloat(key, defaultValue as? Float ?: -1f) as T
is Long -> getLong(key, defaultValue as? Long ?: -1) as T
else -> throw UnsupportedOperationException("Error")
}
}
}
SharedPreferences를 관리하는 PreferenceHelper object를 만들어서
SharedPreferences를 관리할 때 사용하는 정보를 저장하는 set, 정보를 불러오는 get operator를 생성한다.
Kotlin에서는 배열이나 맵의 원소 접근시 대괄호를 사용할 수 있고, 이러한 인덱스 연산자를 사용하기 위해 operator를 만들어 준 것이다. 호출 시 Type에 따라 저장/불러오기를 할 수 있도록 하며, 확장함수 edit를 만들어 사용한다.
3. User.kt
data class User(
var idToken : String? = null,
var refreshToken : String? = null,
var email:String? = null,
var password :String? = null,
var nickname:String? = null,
var gender :String? = null,
var profilePhoto: Uri? = null
)
저장하고 불러올 요소가 담긴 Data Class를 만들어준다.
4. SharedManager.kt
import com.example.hometrain.PreferenceHelper.set
import com.example.hometrain.PreferenceHelper.get
class SharedManager(context: Context) {
private val prefs: SharedPreferences = PreferenceHelper.defaultPrefs(context)
fun saveCurrentUser(user: User) {
prefs["idToken"] = user.idToken
prefs["refreshToken"] = user.refreshToken
prefs["email"] = user.email
prefs["nickname"] = user.nickname
prefs["gender"] = user.gender
prefs["profilePhoto"] = user.profilePhoto
}
fun getCurrentUser() : User {
return User().apply {
idToken = prefs["idToken", ""]
refreshToken = prefs["refreshToken", ""]
email = prefs["email", ""]
nickname = prefs["nickname", ""]
gender = prefs["gender", ""]
profilePhoto = prefs["profilePhoto"]
}
}
}
SharedPreference를 활용해 User에 Data를 저장하고 불러오는 함수를 선언한다.
1번째 글에서도 언급했듯이, 키-값 쌍으로 데이터를 저장한다.
5. MainActivity
private val sharedManager : SharedManager by lazy { SharedManager(this) }
// Fragment인 경우 private val sharedManager : SharedManager by lazy { SharedManager(requireContext()) }
val currentUser = User().apply {
name = (EditText ID).text.toString().trim()
age = (EditText ID).text.toString().toInt()
email = (EditText ID).text.toString().trim()
password = (EditText ID).toString().trim()
}
sharedManager.saveCurrentUser(currentUser)
val currentUser = sharedManager.getCurrentUser()
val result = "name: ${currentUser.name} \n" +
"age: ${currentUser.age} \n" +
"email: ${currentUser.email} \n" +
"password: ${currentUser.password} \n"
(텍스트뷰).text = result
저장하고 불러오는 코드부분이다.
통신 후 로그인이 성공하고 나서 전달받은 Response을 User Data에 apply해주고 저장하도록
위의 코드를 적절히 변형시킨다.
해당 정보가 필요한 부분을 sharedManager.getCurrentUser()로 가져오면 된다.
[참고 블로그]
반응형