如何在 Android 中保存自定义 Java 对象?

Posted

技术标签:

【中文标题】如何在 Android 中保存自定义 Java 对象?【英文标题】:How to save a custom Java Object in Android? 【发布时间】:2015-04-15 08:39:24 【问题描述】:

你能帮帮我吗?我正在尝试将我的 Java 对象(客户)保存在 android 中,目前我正在学习一本书。

这就是我得到的,我有一个具有字符串和 UUID 的客户对象。有了这些,我可以通过使用 JSON 转换成功地保存它们。我的问题是我想为每个客户添加一个包含(双和两个字符串)的对象数组列表。当我将客户对象转换为 json 时,如何保存此 ArrayList 并在该 JSON 对象中检索它。

我研究过,但不能真正理解它。我找到了 GSON,但我不确定这是否是我需要的,也不知道如何将这个库添加到我的项目中。另一个是我可以将 JSONArray 放入 JSON 对象吗?这是我发现但不确定的两个潜在解决方案。我试图通过文件而不是 SQLite 来保存它。到底有没有?

这是 Customer 类的代码

    public class Customer 

//Constants for JSON
private static final String JSON_ID = "id";
private static final String JSON_NAME = "name";

private String mName;
private UUID mID;
private ArrayList<Item> mItems;

public Customer()
    mID = UUID.randomUUID();
    mItems = new ArrayList<Item>();


//Loading Customer from JSON
public Customer(JSONObject jsonObject) throws JSONException
    mID = UUID.fromString(jsonObject.getString(JSON_ID));
    if(jsonObject.has(JSON_NAME))
        mName = jsonObject.getString(JSON_NAME);
    



//JSON converter
public JSONObject toJSON() throws JSONException
    JSONObject json = new JSONObject();
    json.put(JSON_ID, mID.toString());
    json.put(JSON_NAME,mName);
    if (!mItems.isEmpty())

    
    return json;



public UUID getmID() 
    return mID;


public String getmName() 
    return mName;


public void setmName(String mName) 
    this.mName = mName;


//Add item debt
public void addDebt(Item i)
    mItems.add(i);


//Get List Debt
public ArrayList<Item> getmItems()
    return mItems;


public Item getItem(UUID id)
    for (Item item : mItems)
        if (item.getmItemID().equals(id))
            return item;
        
    
    return null;

这是给物品的

   public class Item 

private String mItemName;
private Date mDate;
private UUID mItemID;
private double mPrice;


public Item()
    mDate = new Date();
    mItemID = UUID.randomUUID();


public UUID getmItemID() 
    return mItemID;


public void setmItemID(UUID mItemID) 
    this.mItemID = mItemID;


public String getmItemName() 
    return mItemName;


public void setmItemName(String mItemName) 
    this.mItemName = mItemName;


public String toString()
    return mItemName;


public Date getmDate() 
    return mDate;


public void setmDate(Date mDate) 
    this.mDate = mDate;


public double getmPrice() 
    return mPrice;


public void setmPrice(double mPrice) 
    this.mPrice = mPrice;

【问题讨论】:

【参考方案1】:

您可以执行以下操作将包括 ArrayList 在内的整个对象转换为 json,然后您可以将其保存到您的 SharedPreferences

为此,您需要导入 GSON 库。以下是你的做法。

如果您使用的是 Android Studio

转到您的 build.gradle 文件并打开它 向下滚动直到看到dependencies 添加以下行并同步项目(选项将出现在屏幕顶部compile 'com.google.code.gson:gson:2.3.1'

如果您使用的是 Eclipse

Downloadgson 罐子 右键单击您的项目并选择属性 选择左侧的“Java Build Path”,然后选择“Libraries”选项卡。现在,点击“添加外部 JARS...”按钮 找到并选择刚刚下载的jar文件,然后点击“打开” 最后点击“ok”应该可以在引用的库下看到了

现在代码看起来像这样

SharedPreferences mSettings = getSharedPreferences("YourPreferenceName", Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mSettings.edit();

GsonBuilder gsonb = new GsonBuilder();
Gson mGson = gsonb.create();

假设您有两种方法,一种用于保存对象,另一种用于读取对象。

public boolean writeJSON(Customer c, String yourSettingName)

   try 
       String writeValue = mGson.toJson(c);
       mEditor.putString(yourSettingName, writeValue);
       mEditor.commit();
       return true;
   
   catch(Exception e)
   
       return false;
   


public Customer readJSON(String yourSettingName)

   String loadValue = mSettings.getString(yourSettingName, "");
   Customer c = mGson.fromJson(loadValue, Customer.class);
   return c;

然后您可以调用这些方法,它会通知您写入是否成功,当您调用读取时,它会返回您之前保存的客户对象。

希望对你有所帮助

【讨论】:

这很有趣。我想我需要导入一个库。你能帮我做这件事吗?你也可以成为我学习的导师吗?当我遇到问题时,我会仰慕的人。只要你有时间。 @noooobies123 请再看看我的帖子。我编辑了我的帖子,解释了如何添加库【参考方案2】:

GSON 的思想是它可以将 JSON 字符串直接转换为 Java 对象。下面是一个使用 GSON 解析 JSON 字符串的例子:

Gson gson = new Gson();
Notes notes = gson.fromJson(json.toString(), Notes.class);

这将解析 JSON 并将其转换为 Notes 对象。

将它转换回来应该像下面这样简单,但是在我的代码库中我不使用它,所以它未经测试:

Gson gson = new Gson();
String json = gson.toJson(notes, Notes.class);

【讨论】:

以上是关于如何在 Android 中保存自定义 Java 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 屏幕旋转上保存自定义 ArrayList?

如何实现自定义Java运行时注解功能

Android -- 每日一问:自定义 View 的状态是如何保存的?

Android 在 APK 中保存自定义数据

android如何为自定义的类传递参数?

Android:需要在自定义适配器列表视图中保存复选框状态