android - 以共享首选项存储和检索类对象

在Android中,我们可以在共享首选项中存储类的对象,并在以后检索该对象吗?

如果有可能怎么办? 如果不可能做到这一点的其他可能性是什么?

我知道序列化是一种选择,但我正在寻找使用共享偏好的可能性。

12个解决方案

310 votes

是的,我们可以使用Gson做到这一点

从GitHub下载工作代码

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

为了保存

Editor prefsEditor = mPrefs.edit();

Gson gson = new Gson();

String json = gson.toJson(myObject); // myObject - instance of MyObject

prefsEditor.putString("MyObject", json);

prefsEditor.commit();

为了得到

Gson gson = new Gson();

String json = mPrefs.getString("MyObject", "");

MyObject obj = gson.fromJson(json, MyObject.class);

UPDATE1

可以从github.com/google/gson下载最新版本的GSON。

UPDATE2

如果您正在使用Gradle / Android Studio,请在build.gradle依赖项部分中添加以下内容 -

compile 'com.google.code.gson:gson:2.6.2'

Parag Chauhan answered 2019-07-14T16:28:00Z

44 votes

我们可以使用Outputstream将Object输出到内部存储器。 并转换为字符串然后保存优先。 例如:

mPrefs = getPreferences(MODE_PRIVATE);

SharedPreferences.Editor ed = mPrefs.edit();

ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

ObjectOutputStream objectOutput;

try {

objectOutput = new ObjectOutputStream(arrayOutputStream);

objectOutput.writeObject(object);

byte[] data = arrayOutputStream.toByteArray();

objectOutput.close();

arrayOutputStream.close();

ByteArrayOutputStream out = new ByteArrayOutputStream();

Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);

b64.write(data);

b64.close();

out.close();

ed.putString(key, new String(out.toByteArray()));

ed.commit();

} catch (IOException e) {

e.printStackTrace();

}

当我们需要从Preference中提取Object时。 使用以下代码

byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();

if (bytes.length == 0) {

return null;

}

ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);

Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);

ObjectInputStream in;

in = new ObjectInputStream(base64InputStream);

MyObject myObject = (MyObject) in.readObject();

Kislingk answered 2019-07-14T16:28:32Z

15 votes

不可能。

您只能在SharedPreferences SharedPreferences.Editor中存储简单值

您需要保存什么特别的课程?

Blundell answered 2019-07-14T16:26:47Z

8 votes

我有同样的问题,这是我的解决方案:

我有类MyClass和ArrayList< MyClass> 我要保存到共享首选项。 起初,我已经向MyClass添加了一个将其转换为JSON对象的方法:

public JSONObject getJSONObject() {

JSONObject obj = new JSONObject();

try {

obj.put("id", this.id);

obj.put("name", this.name);

} catch (JSONException e) {

e.printStackTrace();

}

return obj;

}

然后是保存对象的方法" ArrayList< MyClass>项":

SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);

SharedPreferences.Editor editor = mPrefs.edit();

Set set= new HashSet();

for (int i = 0; i < items.size(); i++) {

set.add(items.get(i).getJSONObject().toString());

}

editor.putStringSet("some_name", set);

editor.commit();

以下是检索对象的方法:

public static ArrayList loadFromStorage() {

SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);

ArrayList items = new ArrayList();

Set set = mPrefs.getStringSet("some_name", null);

if (set != null) {

for (String s : set) {

try {

JSONObject jsonObject = new JSONObject(s);

Long id = jsonObject.getLong("id"));

String name = jsonObject.getString("name");

MyClass myclass = new MyClass(id, name);

items.add(myclass);

} catch (JSONException e) {

e.printStackTrace();

}

}

return items;

}

请注意,自API 11起,共享首选项中的StringSet可用。

Micer answered 2019-07-14T16:29:31Z

6 votes

使用Gson库:

dependencies {

compile 'com.google.code.gson:gson:2.8.2'

}

商店:

Gson gson = new Gson();

//Your json response object value store in json object

JSONObject jsonObject = response.getJSONObject();

//Convert json object to string

String json = gson.toJson(jsonObject);

//Store in the sharedpreference

getPrefs().setUserJson(json);

检索:

String json = getPrefs().getUserJson();

Ramesh sambu answered 2019-07-14T16:30:12Z

1 votes

你可以使用GSON,使用Gradle Build.gradle:

implementation 'com.google.code.gson:gson:2.8.0'

然后在你的代码中,例如使用Kotlin对string / boolean:

val nestedData = HashMap()

for (i in 0..29) {

nestedData.put(i.toString(), true)

}

val gson = Gson()

val jsonFromMap = gson.toJson(nestedData)

添加到SharedPrefs:

val sharedPrefEditor = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE).edit()

sharedPrefEditor.putString("sig_types", jsonFromMap)

sharedPrefEditor.apply()

现在要检索数据:

val gson = Gson()

val sharedPref: SharedPreferences = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE)

val json = sharedPref.getString("sig_types", "false")

val type = object : TypeToken>() {}.type

val map = gson.fromJson(json, type) as LinkedTreeMap

for (key in map.keys) {

Log.i("myvalues", key.toString() + map.get(key).toString())

}

CAZ answered 2019-07-14T16:31:09Z

1 votes

您可以通过3个简单的步骤使用PowerPreference库来完成它!

[https://github.com/AliAsadi/PowerPreference]

1.创建对象

Object obj = new Object();

2.写入共享首选项

PowerPreference.getDefaultFile().put("object",obj);

3.获得对象

Object obj = PowerPreference.getDefaultFile()

.getObject("object", Object.class);

Ali Asadi answered 2019-07-14T16:32:03Z

0 votes

使用此对象 - &gt; TinyDB - Android-Shared-Preferences-Turbo非常简单。你可以保存大多数常用的对象,如数组,整数,字符串列表等

kc ochibili answered 2019-07-14T16:32:31Z

0 votes

您可以使用Android的复杂首选项 - 由Felipe Silvestre库存储您的自定义对象。基本上,它使用GSON机制来存储对象。

要将对象保存到prefs:

User user = new User();

user.setName("Felipe");

user.setAge(22);

user.setActive(true);

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(

this, "mypref", MODE_PRIVATE);

complexPreferences.putObject("user", user);

complexPreferences.commit();

并将其检索回来:

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", MODE_PRIVATE);

User user = complexPreferences.getObject("user", User.class);

Serhii Hrabas answered 2019-07-14T16:33:11Z

-1 votes

您是否需要在应用程序关闭或仅在其运行期间检索对象?

您可以将其存储到数据库中。

或者只需创建一个自定义Application类。

public class MyApplication extends Application {

private static Object mMyObject;

// static getter & setter

...

}

...

...

然后从每个活动做:

((MyApplication) getApplication).getMyObject();

不是最好的方式,但它的工作原理。

luc.chante answered 2019-07-14T16:34:06Z

-1 votes

没有办法在SharedPreferences中存储对象,我做的是创建一个公共类,放置我需要的所有参数并创建setter和getter,我能够访问我的对象,

Ismael ozil answered 2019-07-14T16:34:35Z

-5 votes

是的。您可以使用共享首选项存储和检索对象

Sukanya answered 2019-07-14T16:35:01Z

android 类对象的存储,android - 以共享首选项存储和检索类对象相关推荐

  1. android实例教程_Android共享首选项示例教程

    android实例教程 In this tutorial we'll use Shared Preferences in our android application to store data i ...

  2. 共享首选项中commit()和apply()之间的区别是什么

    我在我的Android应用程序中使用共享首选项. 我正在使用共享首选项中的commit()和apply()方法. 当我使用AVD 2.3时它没有显示错误,但是当我在AVD 2.1中运行代码时, app ...

  3. SD卡读写,首选项,共享首选项

    Android-SD卡读写 adb shell mksdkcard 50m d:\xxx\xxxx.img 挂载/卸载sd卡 <uses-permission android:name=&quo ...

  4. android手机强制关机代码,android – 当应用程序强制关闭或设备重新启动时,共享首选项重置数据...

    我有一个登录屏幕,希望应用程序看起来好像在应用程序关闭/销毁/电话呼叫等后仍然在内部屏幕上"登录". 我有一个首选项对象来保存登录或注册后的值.我在所有关键屏幕onResume() ...

  5. 如何使用意图将对象从一个Android活动发送到另一个?

    如何使用Intent类的putExtra()方法将自定义类型的对象从一个Activity传递到另一个Activity ? #1楼 感谢您的包裹帮助,但我发现了另一种可选解决方案 public clas ...

  6. android安全开发_现代android安全开发

    android安全开发 第一次(错误)练习 (1st (Mistake) Practice) Given the "find out how to en-decrypt data in An ...

  7. android 计算到期日期,在Android上计算日期

    我正在为Android构建一个应用程序,我需要存储一天并计算到那一天到来的天数. 我将这一天存储在共享的首选项上.首先,我初始化日历. Calendar next = Calendar.getInst ...

  8. android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)

    我是Kotlin的新手,我正在尝试为我的应用进行设置活动,我希望该活动将其价值传递给其他活动. 我尝试了不同的代码,但没有一个起作用,我尝试制作一个共享的首选项文件,但我不知道如何编写代码 要清楚,我 ...

  9. android 转屏 多个实例,android – 处理appwidget的多个实例

    我有一个配置活动,一个大型小部件提供程序和一个小小部件提供程序.从配置活动中,我在共享首选项中保存了一些值.从大型和小型应用小部件提供商,我得到这些共享的偏好.我无法为应用程序小部件提供唯一的ID,并 ...

最新文章

  1. MySQL数据库将查询结果插入到其它表中
  2. php8的jit如何使用,PHP JIT 是什么?PHP8 新特性之 JIT 图文详解
  3. MySql乱码解决(五)
  4. Symbian,倒在3G的门槛上
  5. 好好学python·基本数据类型
  6. c# spire.xls 设置文字为微软雅黑_Excel工作薄常规样式设置,WorkBook.Styles
  7. python——闭包与闭包中修改外部变量
  8. vtk类之vtkFixedPointVolumeRayCastMapper :一个固定像素点的体数据映射器
  9. python常用单词自由且开放_python常用英语单词词汇 unit7
  10. 目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)
  11. Python实现二叉树
  12. php输出学生成绩foreach,PHP中foreach输出值不正确
  13. 批处理 Telnet 星球大战 话说我也清楚这是什么东东
  14. cppunit在vs2008下使用的环境搭建
  15. WPF-使用代码创建Grid行与列,并将控件添加到Grid中的指定行指定列
  16. JavaScript 汉字与拼音互转终极方案 附JS拼音输入法
  17. [计算机数值分析]开方公式-牛顿法
  18. 【Linux CentOS】 实用指令之帮助指令
  19. Linux 历史简介
  20. gpu 数据库_GPU驱动的数据库可以为您做什么

热门文章

  1. 战地4稳定的服务器,战地4 游戏服务器
  2. CPAL脚本自动化测试 ———— Flexray系列函数及使用
  3. java怎么获取屏幕PPI_智能手机屏幕清晰度用户体现的分析:PPI与PPI2
  4. JRE和JDK的解释及区别
  5. Live Messenger ,Gmail ,Orkut ,Wallop
  6. js实现颜色从蓝色渐变到红色
  7. linux系统windows模拟器下载,Wine 1.7.40 发布下载,Windows 模拟器
  8. C语言编程>第一周 ⑦ 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
  9. 高项、高级项目管理师论文-风险管理
  10. c语言中整型常量ox,C语言基础教程:数字常量