如何在android中利用shared preferences存储和读取数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在android中利用shared preferences存储和读取数据相关的知识,希望对你有一定的参考价值。

1、任务目标

(1)掌握android中SharedPreferences的使用方法。

2、任务陈述

(1)运行后,显示如下界面,可以写入和读取SharedPreferences中的数据:

3、任务实施及所涉及知识技能讲解

第一步:新建一个Android工程,命名为SharedPreferencesWrite。

第二步:在layout下添加一个使用线性布局的布局文件,命名为:main.xml。

布局文件源代码:

http://www.worlduc.com/blog2012.aspx?bid=19403636

第三步:在CopySharedPreferencesTest.java下声明如下变量,并导入导入相关包(如何使用SharedPreferences存储和读取数据):

[java] view plain copy
SharedPreferences preferences;
Editor editor;

第四步:在onCreate方法中修改如下代码:

[java] view plain copy
setContentView(R.layout.main);

第五步:在onCreate方法中实例化前面声明的两个对象,代码如下:

[java] view plain copy
preferences = getSharedPreferences("crazyit", MODE_WORLD_READABLE);
editor = preferences.edit();

第六步:在onCreate方法中获取两个按钮,代码如下:

[java] view plain copy
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);

第七步:在onCreate方法中为两个按钮添加监听器,代码如下:

[java] view plain copy
write.setOnClickListener(new OnClickListener()

@Override
public void onClick(View arg0)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "
+ "hh:mm:ss");
// 存入当前时间
editor.putString("time", sdf.format(new Date()));
// 存入一个随机数
editor.putInt("random", (int) (Math.random() * 100));
// 提交所有存入的数据
editor.commit();

);

read.setOnClickListener(new OnClickListener()

@Override
public void onClick(View arg0)

//读取字符串数据
String time = preferences.getString("time", null);
//读取int类型的数据
int randNum = preferences.getInt("random", 0);
String result = time == null ? "您暂时还未写入数据": "写入时间为:" + time + "\n上次生成的随机数为:" + randNum;
//使用Toast提示信息
Toast.makeText(SharedPreferencesTest.this ,
result , 5000).show();

);

第七步:点击运行程序,程序源代码如下:http://www.worlduc.com/blog2012.aspx?bid=19403601

课堂练习:创建一个记录应用程序使用次数的程序,当用户第一次启动应用程序时,系统创建SharedPrefererences,来记录使用次数。用户以后启动应用程序时,系统先读取SharedPrefererences中记录的使用次数,然后将使用次数加1。

程序源代码如下:

http://www.worlduc.com/blog2012.aspx?bid=19403695
参考技术A /**
* 将值存储到SharedPreferences
* @param context 上下文对象
* @param name 存储的名称
* @param value 存储的值
* @param filename 存储的文件名
*/
public static void saveToSharedPreferences(Context context,String name,String value,String filename)
SharedPreferences.Editor editor=context.getSharedPreferences(filename,Context.MODE_PRIVATE).edit();
editor.putString(name,value);
editor.commit();

/**
* 获取指定的值
* @param context 上下文对象
* @param name 需要获取的值名称
* @param filename 文件名
* @return
*/
public static String getFromSharedPreferences(Context context,String name,String filename)
String value="";
SharedPreferences read = context.getSharedPreferences(filename,Context.MODE_PRIVATE);
//步骤2:获取文件中的值
value = read.getString(name, "");
return value;


当然这只是取String 类型的 其他的也是同理本回答被提问者采纳
参考技术B SharedPreferences sp = context.getSharedPreferences(cookie_save_path, Context.MODE_APPEND);

sp.edit().putString(cookie_save_key, gson.toJson(new TempMap(response.headers))).commit();

String headerString = sp.getString(cookie_save_key, null);
参考技术C 获取SharedPreferences的两种方式:
1 调用Context对象的getSharedPreferences()方法
2 调用Activity对象的getPreferences()方法
两种方式的区别:
调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.

SharedPreferences的四种操作模式:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
将数据保存至SharedPreferences:
SharedPreferences preferences=getSharedPreferences("user",Context.MODE_PRIVATE);
Editor editor=preferences.edit();
String name="xixi";
String age="22";
editor.putString("name", name);
editor.putString("age", age);
editor.commit();

从SharedPreferences获取数据:
SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE);
String name=preferences.getString("name", "defaultname");
String age=preferences.getString("age", "0");

如何从 Qt 获取 android <shared-storage> 路径?

【中文标题】如何从 Qt 获取 android <shared-storage> 路径?【英文标题】:How to get the android <shared-storage> path from Qt? 【发布时间】:2015-08-10 00:11:04 【问题描述】:

我不得不在 Google Play 控制台中使用我的应用(使用 Qt 开发)上传单独的扩展文件。这是一个简单的 rcc 文件。上传后我有文件名(它显示在谷歌控制台页面上)。但我似乎无法在 Android 文档页面 (http://developer.android.com/google/play/expansion-files.html#StorageLocation) 上找到有关如何获取共享存储路径(如前所述)的任何信息。

我确实遇到了这个问题 (How to add android expansion files using Qt),用户似乎已经解决了这个问题,但没有提供有关如何获取共享存储路径的任何详细信息。

【问题讨论】:

【参考方案1】:

我已经解决了:

我使用 qt rcc tool 将包含大文件的 qrc 转换为二进制文件,然后使用以下代码从 Qt Android Activity 调用正确的方法并检索到扩展文件的正确路径:

QAndroidJniObject mediaDir = QAndroidJniObject::callStaticObjectMethod("android/os/Environment", "getExternalStorageDirectory", "()Ljava/io/File;");
QAndroidJniObject mediaPath = mediaDir.callObjectMethod( "getAbsolutePath", "()Ljava/lang/String;" );
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
QAndroidJniObject package = activity.callObjectMethod("getPackageName", "()Ljava/lang/String;");

QString dataAbsPath = mediaPath.toString()+"/Android/obb/"+package.toString()+"/yourExpansionFileName.obb";

QAndroidJniEnvironment env; // Don't know what this is for ? 
if (env->ExceptionCheck())  env->ExceptionClear();  // Or this...?

bool loadResource = QResource::registerResource(dataAbsPath);

别忘了在你的应用中添加#include &lt;QAndroidJniEnvironment&gt;(在pro文件中添加QT += androidextras),最后将此权限添加到清单中(因为扩展文件位于外部存储中):

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在加载之前我没有检查文件是否存在(我测试的每台设备都可以正常工作),但 android 文档说您可能需要手动下载它。上传扩展文件也有一些问题,您只能在第二次提交 apk 时添加它们(在 Google play 中)。

【讨论】:

env 对象使您可以检查通过 JNI 调用 Java 方法时是否发生异常。您检查是否发生任何异常,然后清除/处理它们。如果您不这样做就继续,您的程序可能会变得不稳定并崩溃(我自己没有遇到过这种情况)。【参考方案2】:

此代码可能会对您有所帮助。

QStringList systemEnvironment = QProcess::systemEnvironment();

寻找

    EXTERNAL_STORAGE=/storage/emulated/legacy EXTERNAL_ADD_STORAGE=/storage/external_SD SECONDARY_STORAGE=/storage/external_SD ...

【讨论】:

【参考方案3】:

这段代码对我有用:

QString s = QStandardPaths::writableLocation(QStandardPaths::movieLoaction);
QDir MyDir;
s = s + "/MyFolder"
MyDir.mkdir(s);

在您的 Android 设备中,您必须检查应用程序的存储权限。如果不添加此权限,则运行应用程序。

【讨论】:

以上是关于如何在android中利用shared preferences存储和读取数据的主要内容,如果未能解决你的问题,请参考以下文章

利用 Android 系统原生 API 实现分享功能(2)

利用 Android 系统原生 API 实现分享功能

如何从 Qt 获取 android <shared-storage> 路径?

如何在android端访问flutter Shared首选项(使用java)

Android安装apk应用的时候出现INSTALL_FAILED_SHARED_USER_INCOMPATIBLE如何解决

Android开发常用工具类