【Android】SharedPreferences

1,概述

android平台提供的轻量级数据存储类,类似window配置文件,本文旨在讲解基本使用、一些注意事项。

2,简单实例

public void useSharedPreferencesDemo(Context context){
        //通过context获取的SharedPreferences可以在同一应用访问数据,
        //如果是Activity,使用 ((Activity) context).getPreferences(Context.MODE_PRIVATE);数据只可在该Activity访问;
        SharedPreferences sharedPreferences = context.getSharedPreferences("sharedPreferences", Context.MODE_PRIVATE);

        //拿到编译器
        SharedPreferences.Editor edit = sharedPreferences.edit();

        //五种类型的写入
        edit.putString("string-key", "default-value");
        edit.putBoolean("bool-key", false);
        edit.putInt("int-key", -1);
        edit.putLong("long-key", -1);
        edit.putStringSet("string-set-key", Set.of("1", "2"));

        //等待提交结果,同步操作
        boolean commit = edit.commit();
        
        //异步提交,
        edit.apply();
        
        
        //清空数据
        edit.clear();
        
        //移除key值对应数据
        edit.remove("key");
        
        //读取数据,方法对应put
        Map<String, ?> all = sharedPreferences.getAll();
}

3,关注点

commit:

android.content.SharedPreferences.Editor boolean commit()

将您的首选项更改从该编辑器提交回它正在编辑的SharedPreferences对象。 这会自动执行请求的修改,替换 SharedPreferences 中当前的任何内容。
请注意,当两个编辑器同时修改首选项时,最后一个调用 commit 的人获胜。
如果您不关心返回值并且您在应用程序的主线程中使用它,请考虑使用apply代替。

回报:
如果新值已成功写入持久存储,则返回 true。

apply:

将您的首选项更改从该编辑器提交回它正在编辑的SharedPreferences对象。 这会自动执行请求的修改,替换 SharedPreferences 中当前的任何内容。
请注意,当两个编辑器同时修改首选项时,最后一个调用 apply 的人获胜。
与将其首选项同步写入持久存储的commit不同, apply将其更改立即提交到内存中的SharedPreferences但开始异步提交到磁盘,并且您不会收到任何失败的通知。 如果此SharedPreferences上的另一个编辑器在apply仍未完成时执行常规commit ,则commit将阻塞,直到所有异步提交以及提交本身都完成。
由于SharedPreferences实例是进程中的单例,因此如果您已经忽略了返回值,则可以安全地将任何commit实例替换为apply 。
您无需担心 Android 组件生命周期及其与apply()写入磁盘的交互。 该框架确保在切换状态之前完成来自apply()的动态磁盘写入。
SharedPreferences.Editor 接口预计不会直接实现。 但是,如果您之前确实实现了它并且现在收到有关缺少apply()的错误,您可以简单地从apply()调用commit 。

数据库打开模式

/**文件创建模式:默认模式,创建的文件只能由调用应用程序(或共享相同用户ID的所有应用程序)访问。*/
public static final int MODE_PRIVATE = 0x0000;


/**
文件创建模式:允许所有其他应用程序对创建的文件具有读取权限。
从Build.VERSION_CODES.N开始,尝试使用此模式会引发SecurityException 。
已弃用
创建世界可读的文件是非常危险的,并且可能会导致应用程序中的安全漏洞。 强烈建议不要这样做; 相反,应用程序应该使用更正式的交互机制,例如ContentProvider 、 BroadcastReceiver和android.app.Service 。 无法保证此访问模式将保留在文件上,例如在进行备份和恢复时。

*/

@Deprecated
public static final int MODE_WORLD_READABLE = 0x0001;



/**
文件创建模式:允许所有其他应用程序对创建的文件具有写入权限。
从Build.VERSION_CODES.N开始,尝试使用此模式将引发SecurityException 。
已弃用
创建全局可写文件是非常危险的,并且可能会导致应用程序中的安全漏洞。 强烈建议不要这样做; 相反,应用程序应该使用更正式的交互机制,例如ContentProvider 、 BroadcastReceiver和android.app.Service 。 无法保证此访问模式将保留在文件上,例如在进行备份和恢复时。
*/
@Deprecated
public static final int MODE_WORLD_WRITEABLE = 0x0002;


/**文件创建模式:用于openFileOutput ,如果文件已经存在,则将数据写入现有文件的末尾而不是擦除它。*/
public static final int MODE_APPEND = 0x8000;

/**
SharedPreference 加载标志:设置后,即使在此过程中已经加载了共享首选项实例,也会检查磁盘上的文件是否有修改。 在应用程序有多个进程的情况下,有时需要这种行为,所有进程都写入同一个 SharedPreferences 文件。 但是,通常在进程之间存在更好的通信形式。
这是 Gingerbread (Android 2.3) 中和之前的遗留(但未记录)行为,并且在针对此类版本时隐含此标志。 对于面向高于Android 2.3 的 SDK 版本的应用程序,如果需要,必须显式设置此标志。
已弃用
MODE_MULTI_PROCESS 在某些版本的 Android 中不能可靠地工作,而且不提供任何机制来协调跨进程的并发修改。 应用程序不应尝试使用它。 相反,他们应该使用明确的跨进程数据管理方法,例如ContentProvider 。
*/
@Deprecated
public static final int MODE_MULTI_PROCESS = 0x0004;


/**
数据库打开标志:设置后,默认情况下打开数据库并启用预写日志记录。
也可以看看:
openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) , openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory, DatabaseErrorHandler) , SQLiteDatabase.enableWriteAheadLogging
*/
public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 0x0008;

/**
数据库打开标志:设置时,数据库在不支持本地化整理器的情况下打开。
也可以看看:
openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) , openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory, DatabaseErrorHandler) , SQLiteDatabase.NO_LOCALIZED_COLLATORS
*/
​​​​​​​public static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值