android 类对象的存储,android - 以共享首选项存储和检索类对象
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 - 以共享首选项存储和检索类对象相关推荐
- android实例教程_Android共享首选项示例教程
android实例教程 In this tutorial we'll use Shared Preferences in our android application to store data i ...
- 共享首选项中commit()和apply()之间的区别是什么
我在我的Android应用程序中使用共享首选项. 我正在使用共享首选项中的commit()和apply()方法. 当我使用AVD 2.3时它没有显示错误,但是当我在AVD 2.1中运行代码时, app ...
- SD卡读写,首选项,共享首选项
Android-SD卡读写 adb shell mksdkcard 50m d:\xxx\xxxx.img 挂载/卸载sd卡 <uses-permission android:name=&quo ...
- android手机强制关机代码,android – 当应用程序强制关闭或设备重新启动时,共享首选项重置数据...
我有一个登录屏幕,希望应用程序看起来好像在应用程序关闭/销毁/电话呼叫等后仍然在内部屏幕上"登录". 我有一个首选项对象来保存登录或注册后的值.我在所有关键屏幕onResume() ...
- 如何使用意图将对象从一个Android活动发送到另一个?
如何使用Intent类的putExtra()方法将自定义类型的对象从一个Activity传递到另一个Activity ? #1楼 感谢您的包裹帮助,但我发现了另一种可选解决方案 public clas ...
- android安全开发_现代android安全开发
android安全开发 第一次(错误)练习 (1st (Mistake) Practice) Given the "find out how to en-decrypt data in An ...
- android 计算到期日期,在Android上计算日期
我正在为Android构建一个应用程序,我需要存储一天并计算到那一天到来的天数. 我将这一天存储在共享的首选项上.首先,我初始化日历. Calendar next = Calendar.getInst ...
- android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)
我是Kotlin的新手,我正在尝试为我的应用进行设置活动,我希望该活动将其价值传递给其他活动. 我尝试了不同的代码,但没有一个起作用,我尝试制作一个共享的首选项文件,但我不知道如何编写代码 要清楚,我 ...
- android 转屏 多个实例,android – 处理appwidget的多个实例
我有一个配置活动,一个大型小部件提供程序和一个小小部件提供程序.从配置活动中,我在共享首选项中保存了一些值.从大型和小型应用小部件提供商,我得到这些共享的偏好.我无法为应用程序小部件提供唯一的ID,并 ...
最新文章
- MySQL数据库将查询结果插入到其它表中
- php8的jit如何使用,PHP JIT 是什么?PHP8 新特性之 JIT 图文详解
- MySql乱码解决(五)
- Symbian,倒在3G的门槛上
- 好好学python·基本数据类型
- c# spire.xls 设置文字为微软雅黑_Excel工作薄常规样式设置,WorkBook.Styles
- python——闭包与闭包中修改外部变量
- vtk类之vtkFixedPointVolumeRayCastMapper :一个固定像素点的体数据映射器
- python常用单词自由且开放_python常用英语单词词汇 unit7
- 目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)
- Python实现二叉树
- php输出学生成绩foreach,PHP中foreach输出值不正确
- 批处理 Telnet 星球大战 话说我也清楚这是什么东东
- cppunit在vs2008下使用的环境搭建
- WPF-使用代码创建Grid行与列,并将控件添加到Grid中的指定行指定列
- JavaScript 汉字与拼音互转终极方案 附JS拼音输入法
- [计算机数值分析]开方公式-牛顿法
- 【Linux CentOS】 实用指令之帮助指令
- Linux 历史简介
- gpu 数据库_GPU驱动的数据库可以为您做什么
热门文章
- 战地4稳定的服务器,战地4 游戏服务器
- CPAL脚本自动化测试 ———— Flexray系列函数及使用
- java怎么获取屏幕PPI_智能手机屏幕清晰度用户体现的分析:PPI与PPI2
- JRE和JDK的解释及区别
- Live Messenger ,Gmail ,Orkut ,Wallop
- js实现颜色从蓝色渐变到红色
- linux系统windows模拟器下载,Wine 1.7.40 发布下载,Windows 模拟器
- C语言编程>第一周 ⑦ 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
- 高项、高级项目管理师论文-风险管理
- c语言中整型常量ox,C语言基础教程:数字常量