Android常用的存储数据方式学习与实践(一) —— SharedPreferences

随着项目的深入,开始接触数据相关的工作,下定决心,好好学习一下安卓常见的存储数据的方式,看了很多前辈的分享,主要有5种方式:

1、SharedPreferences(Save key-value data)

2、文件存储

3、Room Database

4、ContentProvider存储

5、网络存储

下面一一进行学习与实践!

一、SharedPreferences方式

如果您希望保存的键值(key-value)集合相对较小,那么应该使用SharedPreferences api。


实践:EditText()输入数据,点击set SharedPreferences按钮,保存数据,并且跳转到第二个页面;在第二个页面点就get SharedPreferences按钮,取得数据,并显示出来!

效果图如下:(录了视频,iMovie剪辑,然后mp4转gif,只为了个动图。。。。。)

详细代码如下:

MainActivity.java set sharedPreferences保存数据并且跳转到SecondActivity。

package com.example.jere.myapplication;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends AppCompatActivity {
    private static final String DATA = "SHARED_PREFERENCE_DATA";

    private Button mSetSharedPreferencesButton;
    private EditText mEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewId();

        mSetSharedPreferencesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setSharedPreferences(mEditText.getText().toString());
            }
        });
    }

    public void findViewId() {
        mSetSharedPreferencesButton = findViewById(R.id.set_sp_button);
        mEditText = findViewById(R.id.input_content_edit_text);
    }

    public void setSharedPreferences(String inputString) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(DATA, inputString);
        editor.apply();

        Intent secondIntent = new Intent(this, SecondActivity.class);
        startActivity(secondIntent);
    }

}

SecondActivity.java 获取SharedPreferences数据并且显示出来:

package com.example.jere.myapplication;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    private static final String DATA = "SHARED_PREFERENCE_DATA";

    private TextView mTextView;
    private String contentString;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        mTextView = findViewById(R.id.display_sp_test);
        Button mSharedPreferencesButton = findViewById(R.id.button_get_sp);

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        contentString = sharedPreferences.getString(DATA,null);
        
        mSharedPreferencesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText(contentString);
                mTextView.setVisibility(View.VISIBLE);
            }
        });
    }
}

写入数据(Write to shared preferences):

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score_key), newHighScore);
editor.commit();

读取数据(Read from shared preferences):

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue);

getSharedPreferences(): 如果需要通过名称标识多个共享首选项文件(shared preference file ),请使用此参数,可以使用第一个参数指定这些文件。你可以从应用程序的任何Context调用它。

Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);

getSharedPreferences实践:两个activity之间进行存/取数据,实现数据共享,上代码!

在MainActivity中存数据:

SharedPreferences sharedPref = this.getSharedPreferences(GET_SHARED_PREFERENCES, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(NAME, "My name is Jere!");
        editor.putString(HOBBY, "I like play basketball!");
        editor.apply();

        mSetSharedPreferencesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent secondIntent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(secondIntent);
            }
        });

在SecondActivity中取出数据()并显示出来:

SharedPreferences sharedPref = this.getSharedPreferences(GET_SHARED_PREFERENCES, Context.MODE_PRIVATE);
        String nameString = sharedPref.getString(NAME, null);
        String hobbyString = sharedPref.getString(HOBBY, null);
        contentString = nameString + "\n" + hobbyString;

        mSharedPreferencesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText(contentString);
                mTextView.setVisibility(View.VISIBLE);
            }
        });

效果图如下:

getPreferences(): 如果只需要为actiity使用一个共享首选项文件(shared preference file),请在Activity中使用此选项。因为这将是用于 Activity 的唯一首选项文件,所以无需提供名称。
因此,当你要保存/检索的数据可以在应用程序中的不同活动中使用时,使用getSharedPreferences。如果这些首选项仅用于一个Activity,则可以使用getPreferences。
例如,只需要为activity提供一个共享首选项文件(shared preference file) 的方法如下: 

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

getPreferences()实践,在同一个activity下进行保存/读取显示数据,同时尝试在不同的activity下读取数据。

上代码:

在MainActivity中保存/读取显示数据:

// save data
        mSetSharedPreferencesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences sharedPref = MainActivity.this.getPreferences(Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putString(NAME, mEditText.getText().toString());
                editor.apply();
            }
        });

        // retrieve data and display
        getSpButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences sharedPref = MainActivity.this.getPreferences(Context.MODE_PRIVATE);
                String nameString = sharedPref.getString(NAME, "test by null");
                displaySpText.setText(nameString);
            }
        });

        // go to second activity
        mNextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent secondIntent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(secondIntent);
            }
        });

在SecondActivity中读取数据:

// retrieve data in second activity
        SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
        contentString = sharedPref.getString(NAME, "null");

        // display data
        mSharedPreferencesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText(contentString);
                mTextView.setVisibility(View.VISIBLE);
            }
        });

效果图如下:

getDefaultSharedPreferences(): 可以获得整个应用程序的默认共享首选项文件,通过调用静态方法PreferenceManager.getDefaultSharedPreferences() 将共享首选项文件保存在应用程序任何actiity都可以访问的位置中.
例如,从应用中的任何其他 Activity 读取某个首选项值的方法如下:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");

getDefaultSharedPreferences()见第一段代码!

总结:getPreferences()只能在当前页面(同一个activity)之间进行数据存取,若想在多个activity中共享数据,需要使用getSharedPreferences()和getDefaultSharedPreferences();


SharedPreferences的操作模式(MODE):

Context.MODE_PRIVATE 为默认操作模式,其中创建的文件只能被调用应用程序访问,既只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
Context.MODE_APPEND 模式会检查文件是否存在,存在就往文件末尾追加内容而不是覆盖,否则就创建新文件。

Context.MODE_WORLD_READABLE

Context.MODE_WORLD_WRITEABLE

自API level 17就已经弃用,从Android 7.0 (API level 24)开始,如果使用,Android会抛出SecurityException异常。如果您的应用程序需要与其他应用程序共享私有文件,它可以使用带有FLAG_GRANT_READ_URI_PERMISSION的FileProvider。

commit() 和 apply()会更改内存中的SharedPreferences对象,并将数据写入磁盘。但是commit()是同步的,所以应该避免在主线程中调用他,以勉出现暂停UI的呈现。反之,apply()则是异步执行。

猜你喜欢

转载自blog.csdn.net/jerechen/article/details/83722574