android 存储对象_在Android中存储对象

android 存储对象

在Android上使用SQLite的一种替代方法是将Java对象存储在SharedPreferences中 。 在这里,我们将研究两种不同的方法。

为什么不为所有存储需求选择SQLite? 原因可能多种多样:除了在面向对象和关系数据库之间的阻抗不匹配之外,对于某些简单的用例,SQLite可能会过大(带来更多开销),或者可能完全不喜欢 SQLite的使用和语法。

作为示例,我们将使用以下User类:

/** User object to be saved in db */
public class User{

    private int id; // used for object storage
    private String userName;
    private boolean registered;
    private double score;

    /** Constructor */
   public User(int id, String userName, boolean registered, double score){
       this.id = id;
       this.userName = userName;
       this.registered = registered;
       this.score = score;
   }
   // getters and setters here...
}

唯一标识符ID很可能由我们的服务器分发,尽管一旦我们创建了User并将其单独存储在SharedPreferences中 (取决于应用程序的设计),我们也可以在设备本身上对其进行计算。 在这里,我们仅将其用作对象存储键。

接下来,我们需要编写我们的首选项类:

/** stores the user object in SharedPreferences */
public class UserPrefs{

    /** This application's preferences label */
    private static final String PREFS_NAME = "com.our.package.UserPrefs";

    /** This application's preferences */
    private static SharedPreferences settings;

   /** This application's settings editor*/
   private static SharedPreferences.Editor editor;

   /** Constructor takes an android.content.Context argument*/
   public UserPrefs(Context ctx){
        if(settings == null){
           settings = ctx.getSharedPreferences(PREFS_NAME, 
                                               Context.MODE_PRIVATE );
        }
       /*
        * Get a SharedPreferences editor instance.
        * SharedPreferences ensures that updates are atomic
        * and non-concurrent
        */
        editor = settings.edit();     
   }
   //...
}

方法1:具有字段键的展平对象

这里的想法是,尽管SharedPreferences仅存储基本类型,但对象构造最终是基本的“包”。 因此,我们可以将一个对象分解为一组原语,并使用唯一的键分别存储每个原语。 但是,如果要从存储中重建对象,则确实需要跟踪哪个保存的字段属于哪个对象。

因此,在对UserPrefs类中的给定User对象编写CRUD方法之前,我们需要在每个User类成员上定义唯一键。 为方便起见,我们可以编写一种方法来确保整个键的唯一性:

/** The prefix for flattened user keys */
public static final String KEY_PREFIX =
            "com.our.package.KEY";

/** Method to return a unique key for any field belonging to a given object
* @param id of the object
* @param fieldKey of a particular field belonging to that object
* @return key String uniquely identifying the object's field
*/
private String getFieldKey(int id, String fieldKey) {
       return  KEY_PREFIX + id + "_" + fieldKey;
}

请注意, getFieldKey()如何为我们提供每个字段名称和每个用户的唯一标识符。

现在,我们可以继续编写CRUD方法:

/** generic field keys */
 private static final String KEY_USERNAME = "com.our.package.KEY_USERNAME";
 private static final String KEY_REGISTERED = "com.our.package.KEY_REGISTERED";
 private static final String KEY_SCORE = "com.our.package.KEY_SCORE";

/** Store or Update */
public void setUser(User user){
    if(user == null)
      return; // don't bother

    int id = user.getId();
    editor.putString(
               getFieldKey(id, KEY_USERNAME),
               user.getUsername() );
    editor.putBoolean(
               getFieldKey(id, KEY_REGISTERED),
               user.isRegistered() );
    editor.putFloat(
               getFieldKey(id, KEY_SCORE),
               user.getScore() );

    editor.commit();
}

/** Retrieve */
public User getUser(int id){
    String name = settings.getString( 
                  getFieldKey(id, KEY_USERNAME), 
                  "" ); // default value
    boolean registered =  settings.getBoolean(
                 getFieldKey(id, KEY_REGISTERED), 
                 false); // default value
    double score =  settings.getFloat(
                 getFieldKey(id, KEY_SCORE), 
                 0); // default value

    return new User(id, name, registered, score);
}

/** Delete */
public void deleteUser(User user){
   if(user == null)
      return; // don't bother

   int id = user.getId();
   editor.remove( getFieldKey(id, KEY_USERNAME) );
   editor.remove( getFieldKey(id, KEY_REGISTERED) ); 
   editor.remove( getFieldKey(id, KEY_SCORE) ); 

   editor.commit();
}

现在,我们可以从应用程序中的任何位置创建,检索,更新和删除任何用户对象:

// get a SharedPreferences instance
UserPrefs prefs = new UserPrefs( this.getApplicationContext() );

// get id from server or local storage
// then find User with that id
User user = prefs.getUser(id);

// operations on User, e.g.
user.setRegistered(true);
user.setScore(new_score);

// save
prefs.setUser(user);
// ...or delete
prefs.deleteUser(user),

对于嵌入式对象 ,我们递归应用相同的逻辑,并从User CRUD方法中调用它们的getter / setter方法。 这种扁平化对象的方法是手机上的一种简单的无SQL替代存储。 当然,随着嵌入对象数量的增加,它有其局限性。

方法2:Google Gson

Gson是一个Java库,它提供简单的toJson()fromJson()方法来将Java对象转换为JSON格式,反之亦然。
然后,我们只需将JSON格式作为整个String存储在SharedPreferences中 。 此方法涉及到向我们的项目中添加新的库,但更加方便:

// convert User object user to JSON format
Gson gson = new Gson();
String user_json = gson.toJson(user); 

// store in SharedPreferences 
String id =  "" +  user.getId(); // get storage key
editor.putString(id, user_json);
editor.commit();

// time flies...

// do the reverse operation
 user_json = settings.getString(id, "");
 user  = gson.fromJson(user_json, User.class);

现在可以在我们的UserPrefs类中重写以前的CRUD方法,而无需使用用户ID以外的其他键。 那应该很简单,留给读者作为练习。

结论

我们研究了使用SharedPreferences存储对象的几种方法。 处理对象的其他选项是许多用于Android的ORMORMLitegreenDAOSugar ORMActiveAndroid等),或NOSQL移动数据库,例如Couchbase Lite (当前为Beta版本)。 Couchbase Lite基本上是一个JSON数据库,而当数据模型变得复杂并且我们发现自己编写大量样板化SQLite操作时,各种ORM可以大大简化我们的代码。 与所有旨在降低底层复杂性的抽象一样,ORM的缺点是泄漏抽象定律

在某种程度上,所有非平凡的抽象都是泄漏的。

ORM和NOSQL替代品将成为后续文章的主题。

参考:来自Tony博客博客的JCG合作伙伴 Tony Sicilian 在Android中存储对象

翻译自: https://www.javacodegeeks.com/2013/12/storing-objects-in-android.html

android 存储对象

Android实现文件存储并读取的示例代码 要求: 输入文件名,文件内容分别存储在手机内存和外存中,并且都可以读去取出来。 步骤: 1.创建一个名为CDsaveFile的Android项目 2.编写布局文件activity_main.xml: <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android xmlns:tools=http://schemas.android.com/tools android:layout_width=match_parent android:layout_height=match_paren 立即下载

相关推荐

Android App中各种数据保存方式的使用实例总结

主要介绍了Android App中各种数据保存方式的使用实例,列举了SharedPreferences接口、机身空间存储、SD卡存储和SQLite数据库四种方式的代码例子,需要的朋友可以参考下

Android 数据存储方式一,简单登录演示

Android 数据存储

xaioxaiobai的博客 426

HTPA 32x32d热成像传感器实战指南:从替代MLX90640到精准测温

本文为HTPA 32x32d热成像传感器提供了从硬件连接到精准测温的完整实战指南。针对MLX90640替代需求,详细解析了HTPA传感器的核心优势、IIC通信要点、EEPROM校准数据读取与解析、独特的块数据读取模式,并逐步拆解了五大温度补偿计算流程,旨在帮助开发者克服高开发门槛,实现稳定可靠的非接触式测温应用。

weixin_29279101的博客 278

Android基础概念讲解——类与对象,操作系统基础

Linux 内核有一个叫做“写时复制”(Copy On Write)的技术,在进程 B 尝试写入这一段内存的时候会偷偷把真实的内存给复制一份,最后写入的是这份拷贝里的值,而进程 A 看见的还是原来的值。方法中创建的对象在该方法返回后便失去所有引用成为“不再需要的对象”,如果两次方法调用之间,第一次方法调用中产生的临时对象被上文中提到的 GC 机制回收,对应的内存空间就变得“空闲”,可以被其他对象占用。进程 A 里的对象 a 和进程 B 里的对象 b 拥有相同的内存地址,它们是同一个对象吗?

m0_56255097的博客 548

android对象存储,Android中数据存储,知多少?

【一.Android中数据存储Android的数据存储有5种方式(1). 文件存储(2). SharedPreference存储(3). SQLite数据库存储(4). 使用ContentProvider存储数据(5). 网络存储数据Android 应用数据文件存储路径Android studio连接设备,利用Device File Explorer(Android...

weixin_31925745的博客 540

android 存储实例对象,在实例状态中保存自定义对象数组

我有一个List(CustomObject来自外部库 - 我无法对其进行更改).我想保存这个onSaveInstanceState(Bundle),但我似乎无法做到这一点.以下是我尝试过的选项:outState.putSerializable(KEY, (ArrayList) myList); // because myList is instantiated as an ArrayListout...

weixin_33267354的博客 355

Android进阶——Sharedpreferences保存对象和图片等复杂类型的数据

Sharedpreferences保存序列化的对象和图片等复杂类型的数据

最美不过,心中有梦,身旁有你! 1万+

android 对象存储_在Android存储对象

android 对象存储Android上使用SQLite的一种替代方法是将Java对象存储在SharedPreferences中。 在这里,我们将研究两种不同的方法。 为什么不为所有存储需求选择SQLite? 原因可能多种多样:除了对象定向数据库和关系数据库之间的阻抗不匹配外,对于某些简单的用例,SQLite可能会过大(带来更多开销),或者可能完全不喜欢SQLite的使用和语法。 例如,...

cunfen0516的博客 768

Android存储对象

Android上使用SQLite的一种替代方法是将Java对象存储在SharedPreferences中 。 在这里,我们将研究两种不同的方法。 为什么不为所有存储需求选择SQLite? 原因可能多种多样:除了对象定向和关系数据库之间的阻抗不匹配之外,对于某些简单的用例,SQLite可能会过大(带来更多开销),或者可能完全不喜欢 SQLite的使用和语法。 例如,我们将使用以下Us...

730

android sqlite 存储对象,SQLite存储对象

前言sqliteDataBase能存储的数据类型有:1.NULL:空值。2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。3.REAL:浮点数字,存储为8-byte IEEE浮点数。4.TEXT:字符串文本。5.BLOB:二进制对象。下面就来用一个例子讲讲sqlite存储对象。一.先抛出一个model,类名为Person,代码如下:package com.example.pei.te...

weixin_28760183的博客 470

安卓存储对象到本地

直接上代码: public class MainActivity extends AppCompatActivity { private String mNum; private String mPw; private TextView mTv; private User mUser; @Override protected

TianciZhu的博客 618

android对象存储到文件,android对象存储于本地(内存)

不懂的地方就要花力气搞懂,自己以前没太认真,所以吃了很多亏啊。切入今天的主题。我们的项目中为了实现某些二次编辑的效果,就必须对一些数据进行存储,而能够将对象存储起来,对于我们的开发有时会显得十分的方便,这篇文章主要介绍如何将对象存储于本地,在下一篇文章中我们接着讨论如何将对象存储于SD卡中。android中能够被保存对象都是被序列化过的对象。如何让类实现序列化呢?其实就是让我们的类实现Seria...

weixin_28868483的博客 1071

android 对象存储在哪里,android – 在ApplicationContext中存储对象

当我的应用程序转到后台时,我的(静态和单例)对象被清除.所以我尝试将这些对象存储在Applicaton Context中.我使用以下代码.Accounts.create(getApplicationContext())将被调用一次以存储帐户实例.在应用程序上下文中存储对象是否可行(可靠)?我不确定以下方式是否正确.请指导..public class Init extends Application...

weixin_35858450的博客 226

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

android - 以共享首选项存储和检索类对象Android中,我们可以在共享首选项中存储类的对象,并在以后检索该对象吗?如果有可能怎么办? 如果不可能做到这一点的其他可能性是什么?我知道序列化是一种选择,但我正在寻找使用共享偏好的可能性。12个解决方案310 votes是的,我们可以使用Gson做到这一点从GitHub下载工作代码SharedPreferences mPrefs = get...

weixin_42575505的博客 260

安卓开发】为什么不能往Android的Application对象存储数据

一个App里面总有一些数据需要在多个地方用到。这些数据可能是一个 session token,一次费时计算的结果等。通常为了避免activity之间传递对象的开销,这些数据一般都会保存到持久化存储里面。有人建议将这些数据保存到Application对象里面,这样这些数据对所有应用内的activities可用。这种方法简单,优雅而且……完全扯淡。假设把你的数据都保存到Applicatio...

weixin_30379973的博客 167

android 序列化存储对象,android中對象序列化存儲

項目中要存儲一些數據為了提高不必要的網絡請求,提高效率,用到數據持久化的知識點,針對這個問題,解決辦法其實有很多,以前在項目中是服務獲取到webservice的xml,然后直接將xml保存在本地,之后解析本地xml的格式,這種辦法是針對無參數的一些webservice的數據,比如給一個連接,就可以獲取到xml的數據,比如就是這樣寫的:/*** 更新教練的信息和圖片* **/public boole...

weixin_34347959的博客 153

Android之SharedPreference存储一个对象

思路是采用把对象转化成json 需要Gson的gradle compile 'com.google.code.gson:gson:2.6.2' 把对象转化成json,我这里是List Gson gson = new Gson(); String json = gson.toJson(list) 存储string getSharedPreference

qq_36523667的博客 584

Android基础】Android SQLite存储自定义对象

Android SQLite存储自定义对象在SQLite数据库中可存储的数据类型有NULL、INTEGER、REAL(浮点型)、TEXT、BOOL,一共是五种数据类型。在Android开发中,我们存储数据的一般的作法是数据库的属性就是类的成员变量,比如: 要存储一个人的姓名和年龄,在类中的是将它们定义为两个成员变量class Person{ private String name;

zgljl2012的专栏 7193

android 序列化存储对象,android对象序列化存储

项目中要存储一些数据为了提高不必要的网络请求,提高效率,用到数据持久化的知识点,针对这个问题,解决办法其实有很多,以前在项目中是服务获取到webservice的xml,然后直接将xml保存在本地,之后解析本地xml的格式,这种办法是针对无参数的一些webservice的数据,比如给一个连接,就可以获取到xml的数据,比如就是这样写的:/*** 更新教练的信息和图片* **/public boole...

weixin_35641153的博客 342
上一篇: android 扩展列表_Android中的可扩展列表
下一篇: nfc ndef_NFC Android:读取NDEF标签
danpincheng0204
博客等级 码龄10年 26粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值