Kotlin实现Android SharedPreferences数据存储:从入门到精通

这是文章《在Kotlin中使用Android的SharedPreferences》的第1部分(共2部分)。

内容片段:在本教程中,我们将学习如何使用Kotlin在Android应用程序中实现SharedPreferences。

安卓的SharedPreferences是什么?

SharedPreferences是Android API自API级别1起的一部分。它是一个接口,允许我们在本地存储、修改和删除数据。通常,它用于缓存用户的本地数据,如登录表单。数据以键值对的形式存储。您可以创建多个文件来保存SharedPreferences数据。

SharedPreferences方法

让我们来看一些SharedPreferences的重要方法:

  • getSharedPreferences(String, int)方法用于检索SharedPreferences的实例。其中String是SharedPreferences文件的名称,int是传入的Context模式。
  • SharedPreferences.Editor()用于编辑SharedPreferences中的值。
  • 我们可以调用commit()或apply()来保存SharedPreferences文件中的值。commit()会立即保存值,而apply()会异步保存值。

使用Kotlin设置/获取SharedPreferences的数值

我们可以使用Kotlin的方式在SharedPreferences实例上设置值:

val sharedPreference = getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
var editor = sharedPreference.edit()
editor.putString("username", "Anupam")
editor.putLong("l", 100L)
editor.commit()

用于获取一个值:

sharedPreference.getString("username", "defaultName")
sharedPreference.getLong("l", 1L)
android shared preference types

使用Kotlin清除和删除SharedPreferences记录

我们还可以通过调用clear()和remove(String key)方法来清除所有值或删除特定值:

editor.clear()
editor.remove("username")

注意:提交或应用后对编辑器所做的更改才会生效。以上从SharedPreferences保存和检索值的方法几乎与我们在Java中使用的方式相同。那么Kotlin的魔力在哪里呢?接下来我们将通过一个示例的Android应用程序进行说明。

Android SharedPreferences Kotlin项目结构

android shared preference kotlin project

1. 布局代码

以下是activity_main.xml布局文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/inUserId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:hint="用户ID"
        android:inputType="number" />

    <EditText
        android:id="@+id/inPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inUserId"
        android:hint="密码"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inPassword"
        android:text="保存用户数据" />

    <Button
        android:id="@+id/btnClear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/btnSave"
        android:text="清除用户数据" />

    <Button
        android:id="@+id/btnShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/inPassword"
        android:text="显示" />

    <Button
        android:id="@+id/btnShowDefault"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/btnSave"
        android:text="显示默认值" />

</RelativeLayout>

2. Kotlin代码中的MainActivity

这是文章《在Kotlin中使用Android的SharedPreferences》的第2部分(共2部分)。

下面是MainActivity.kt Kotlin类的代码:

package com.Olivia.androidlysharedpreferences

import android.content.Context
import android.content.SharedPreferences
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.preference.PreferenceManager
import android.view.View
import com.Olivia.androidlysharedpreferences.PreferenceHelper.defaultPreference
import com.Olivia.androidlysharedpreferences.PreferenceHelper.password
import com.Olivia.androidlysharedpreferences.PreferenceHelper.userId
import com.Olivia.androidlysharedpreferences.PreferenceHelper.clearValues
import com.Olivia.androidlysharedpreferences.PreferenceHelper.customPreference

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), View.OnClickListener {

    val CUSTOM_PREF_NAME = "User_data"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnSave.setOnClickListener(this)
        btnClear.setOnClickListener(this)
        btnShow.setOnClickListener(this)
        btnShowDefault.setOnClickListener(this)

    }

    override fun onClick(v: View?) {
        val prefs = customPreference(this, CUSTOM_PREF_NAME)
        when (v?.id) {
            R.id.btnSave -> {
                prefs.password = inPassword.text.toString()
                prefs.userId = inUserId.text.toString().toInt()
            }
            R.id.btnClear -> {
                prefs.clearValues

            }
            R.id.btnShow -> {
                inUserId.setText(prefs.userId.toString())
                inPassword.setText(prefs.password)
            }
            R.id.btnShowDefault -> {

                val defaultPrefs = defaultPreference(this)
                inUserId.setText(defaultPrefs.userId.toString())
                inPassword.setText(defaultPrefs.password)
            }
        }
    }


}

object PreferenceHelper {

    val USER_ID = "USER_ID"
    val USER_PASSWORD = "PASSWORD"

    fun defaultPreference(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

    fun customPreference(context: Context, name: String): SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE)

    inline fun SharedPreferences.editMe(operation: (SharedPreferences.Editor) -> Unit) {
        val editMe = edit()
        operation(editMe)
        editMe.apply()
    }

    var SharedPreferences.userId
        get() = getInt(USER_ID, 0)
        set(value) {
            editMe {
                it.putInt(USER_ID, value)
            }
        }

    var SharedPreferences.password
        get() = getString(USER_PASSWORD, "")
        set(value) {
            editMe {
                it.putString(USER_PASSWORD, value)
            }
        }

    var SharedPreferences.clearValues
        get() = { }
        set(value) {
            editMe {
                it.clear()
            }
        }
}


多亏了Kotlin Android扩展,我们不必为每个XML视图使用findViewById。在上面的代码中,我们使用object关键字创建了一个单例类。我们声明了一个内联高阶函数editMe(),它包含了编辑操作的逻辑。我们为每个值创建了单独的属性。我们使用get和set Kotlin属性来获取和设置共享首选项中的数据。Kotlin减少了代码冗余,并且看起来更加清晰。此外,我们可以使用下面的另一个Kotlin高阶函数使其更加简洁。

fun SharedPreferences.Editor.put(pair: Pair<String, Any>) {
    val key = pair.first
    val value = pair.second
    when(value) {
        is String -> putString(key, value)
        is Int -> putInt(key, value)
        is Boolean -> putBoolean(key, value)
        is Long -> putLong(key, value)
        is Float -> putFloat(key, value)
        else -> error("Only primitive types can be stored in SharedPreferences")
    }

在设置值的同时,我们执行以下操作:

var SharedPreferences.password
        get() = getString(USER_PASSWORD, "")
        set(value) {
            editMe {
                it.put(USER_PASSWORD to value)
            }
        }
android shared preferences kotlin app output

您可以从以下链接下载源代码:AndroidlySharedPreferences

bannerAds