Kotlin TIL(20) [SharedPreferences]

jxxn_aยท2023๋…„ 9์›” 12์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
20/28

๐Ÿ“ SharedPreferences ๐Ÿ“

SharedPreferences๋ž€?

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์ • ์ •๋ณด(์‚ฌ์šฉ์ž์˜ ์˜ต์…˜ ์„ ํƒ ์‚ฌํ•ญ ์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ ์ •๋ณด)๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • XML ํฌ๋งท์˜ ํ…์ŠคํŠธ ํŒŒ์ผ์—ย ํ‚ค-๊ฐ’ ์„ธํŠธ๋กœ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • getSharedPreferences(์—ฌ๋Ÿฌ ๊ฐœ์˜ Shared PreferenceํŒŒ์ผ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)

< ์˜ˆ์‹œ์ฝ”๋“œ >

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

- ์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ด๋Ÿฐ ๊ตฌ์กฐ์ด๋‹ค.
getString(ํ‚ค-name),(๊ฐ’-mode)

์ด๋•Œ!
< name, mode >๋ž€?
1) name : ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  XML ํŒŒ์ผ์˜ ์ด๋ฆ„์ด๋‹ค.
2) mode : ํŒŒ์ผ์˜ ๊ณต์œ  ๋ชจ๋“œ

  • MODE_PRIVATE: ์ƒ์„ฑ๋œ XML ํŒŒ์ผ์€ ํ˜ธ์ถœํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ๋งŒ ์ฝ๊ธฐ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅ
  • MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE์€ ๋ณด์•ˆ์ƒ ์ด์œ ๋กœ API level 17์—์„œ deprecated๋จ
  • getPreferences(ํ•œ ๊ฐœ์˜ Shared Preference ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)

< ์˜ˆ์‹œ์ฝ”๋“œ >

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
  • Activity ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ ์ด๋ฏ€๋กœ, Activity ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ƒ์„ฑํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ ์ „์šฉ์ด๋ฏ€๋กœ ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ์ฝ์„ ์ˆ˜ ์—†๋‹ค.
  • ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ XML ํŒŒ์ผ ์ƒ์„ฑ

๐Ÿ“ ์˜ˆ์ œ ๐Ÿ“

  • ์šฐ์„  ViewBinding์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ build.gradle(Module:app)์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ค€ ๋’ค ์‹ฑํฌํ•ด์ค€๋‹ค.
buildFeatures {
        viewBinding = true
}
  • ๊ทธ ๋‹ค์Œ MainActivity์—์„œ binding์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋“ค์„ ์ž‘์„ฑํ•ด์ค€๋‹ค.

  • Activity_Main.xml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ค€๋‹ค. (EditText์™€ Button ์ถ”๊ฐ€)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:textSize="24sp"
        android:textColor="@color/black"
        android:textStyle="bold"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />

    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="์ €์žฅํ•˜๊ธฐ"
        android:textStyle="bold"
        android:backgroundTint="#223657"
        android:layout_marginTop="30dp"
        app:layout_constraintTop_toBottomOf="@id/et_hello"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />


</androidx.constraintlayout.widget.ConstraintLayout>
  • MainActivity์— ์ด๋ ‡๊ฒŒ ์ ์–ด์ค€๋‹ค.
class MainActivity : AppCompatActivity() {

    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.btnSave.setOnClickListener{
            saveData()
            Toast.makeText(this, "์ €์žฅ ์™„๋ฃŒ" , Toast.LENGTH_SHORT).show()
        }
        loadData()
    }

    private fun saveData() {
        val pref = getSharedPreferences("pref",0)
        val edit = pref.edit()

        edit.putString("name", binding.etHello.text.toString())
        edit.apply()
    }

    private fun loadData(){
        val pref = getSharedPreferences("pref", 0)

        binding.etHello.setText(pref.getString("name",""))
    }
}
  • saveData
    => ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ •๋ณด๊ฐ€ saveData๋กœ ๋„˜์–ด๊ฐ€๊ณ , ๊ทธ๊ฒƒ์„ load ์‹œํ‚จ๋‹ค.
    => saveData์—๋Š” val pref๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ , ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ด์ค€๋‹ค.
    => saveData์—์„œ EditText๋ฅผ binding ํ•ด์ค€๋‹ค.

  • loadData
    => val pref๋กœ saveData์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    => binding์œผ๋กœ EditText๋ถ€๋ถ„์— ์ •๋ณด๋ฅผ ์ถœ๋ ฅ์‹œํ‚จ๋‹ค.

๐Ÿ“ ์˜ˆ์ œ์—์„œ ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œ ๐Ÿ“

  • EditText๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

  • MainActivity๋„ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

  • ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    1) ์ €์žฅ ์™„๋ฃŒ

2) ํ”„๋กœ๊ทธ๋žจ ๋‹ซ๊ธฐ

3) ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ ์ •๋ณด ๋‚จ์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

๐Ÿ’พ ์ €์žฅ๋œ Data ์ฐพ๊ธฐ(prdf ํŒŒ์ผ) ๐Ÿ’พ

1) Emulator ์‹คํ–‰๋˜๋Š” ๊ณณ ์˜ค๋ฅธ์ชฝ์— Device File Explorer ๋ˆ„๋ฅด๊ธฐ

2) data ํŒŒ์ผ -> data ํŒŒ์ผ ์ฐพ๊ณ  ๋ˆ„๋ฅด๊ธฐ

3) ์ด๋ฆ„์— sharedpreference ์ ํžŒ ํŒŒ์ผ ์ฐพ๊ณ  ๋ˆ„๋ฅด๊ธฐ

์˜ˆ์™ธ) sharedpreferenceํŒŒ์ผ์€ ์ฐพ์•˜๋Š”๋ฐ pref ํŒŒ์ผ์ด ์•ˆ ๋ณด์ผ ๊ฒฝ์šฐ

  • ํ•ด๋‹น ํŒŒ์ผ์„ ํด๋ฆญ ํ•œ ๋’ค ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค๋ฅผ ๋ˆ„๋ฅด๊ณ , Synchronize๋ฅผ ํ•ด์ค€๋‹ค.
  • ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด๋ฉด ํŒŒ์ผ์ด ๋ณด์ธ๋‹ค!!

5๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 9์›” 12์ผ

์–ด? ๋ฌด์–ธ๊ฐ€ ๋งŽ์ด ์ƒ๋žต๋œ ๊ฒƒ ๊ฐ™์Šด๋‹ค? ใ…Žใ…Žใ…Žใ…Žใ…Ž
์ด๊ฒŒ ์–ผ๋งˆ๋งŒ์˜ ๋ณด๋Š”......์Šจ์ƒ๋‹˜์˜ TIL์ธ์ง€.....๋ˆ™๋ฌผ

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 9์›” 12์ผ

์˜ค~ ํ•˜๋ฉด์„œ ๋“ค์–ด์™”๋‹ค๊ฐ€ ์–ด? ํ•˜๊ฒŒ ๋˜๋Š” ๋‚ด์šฉ์ด๋„ค์š” :)

1๊ฐœ์˜ ๋‹ต๊ธ€