4

所以,我试图找出将许多数据类型组合在一起的最佳方法。在我的代码内部,我正在创建一个类。在外部,我希望有一个地方可以管理以下类型的数据,或者至少是指向所述数据的指针。请注意,这些数据有很多组,我预计随着时间的推移会增加更多。

编辑:我正在大规模简化曾经在这里的内容。

在编译时想象,我有一个对象列表。每个对象都有一些特征,所有对象都将具有这些特征。这些包括:

  • 一个图像图像
  • 一些字符串
  • 整数数组
  • 字符串数组

我想找到一种方法将所有这些存储在任何代码之外。理想情况下,我想使用 XML,它看起来像这样:

<storage_type>
   <image resid="@id/image1" />
   <name>Item_Name1</name>
</storage_type>
<storage_type>
   <image resid="@id/image2" />
   <name>Item_Name2</name>
</storage_type>

图像当前存储为资源变量。我只是不确定如何将对图像的引用放入 XML 文件中。

如果可以找到更好的解决方案,我不会接受 XML 文件的想法。我想要的只是一个访问这些信息的某种方式的单一数据库。

除非我提交新的更新,否则不应更改此数据。这些不需要在运行时更新,但我肯定想在构建之间不时更新它们。我听说过 Preferences,它可能有效,但我不确定它们是否可能是用户可更新的.

4

3 回答 3

2

在这个问题的相当大的帮助下,我能够找到一个解决方案。

  1. 我的数据存储在一个 XML 数组中。
  2. 该数据包含一个数组索引,该索引指向一个图像数组,在正常资源下维护。

我的数据存储文件如下所示:

<storage_type>
   <image imageArrayIndex="1" />
   <name>Item_Name1</name>
</storage_type>
<storage_type>
   <image imageArrayIndex="2" />
   <name>Item_Name2</name>
</storage_type>

我的 res/values 文件夹中有一个文件,如下所示:

<resources>
    <string-array name="images">
        <item>@drawable/default</item>
        <item>@drawable/image1</item>
        <item>@drawable/image2</item>
    </string-array>
</resources>

在解析 XML 代码的深处,我有:

TypedArray imgs = context.getResources().obtainTypedArray(R.array.achievement_images);
//Whole bunch of code to parse XML, eventually coming to this line:
else if (name.equals("image"))
{
  imageRes=imgs.getResourceId(xpp.getAttributeIntValue(null,"imageArrayIndex", 0),-1);
}

或者,我可以简单地存储图像的名称,如下所示:

<storage_type>
   <image resid="image1" />
   <name>Item_Name1</name>
</storage_type>
<storage_type>
   <image resid="image2" />
   <name>Item_Name2</name>
</storage_type>

然后通过解析 XML 标签来获取它,并通过以下方式获取资源 ID:

int resid=Context.getResources().getIdentifier (name_string_Image, "drawable", null);
于 2012-11-16T10:30:47.160 回答
1

SharedPreferences 是一个选项,但在这种情况下,即使您只需要更改值,您也必须在代码中进行更改。另一方面,xml方式更灵活。

将来,如果您只想更改设置的值,请​​更改 xml 文件并将其推送到用户的手机。无需更改代码,经历测试周期等。如果您想添加/删除东西,那么任何一种方式都需要更改代码(特别是添加部分)

当然,xml 的开销将是读取器/写入器部分。

于 2012-03-18T03:32:46.853 回答
1

我认为您可以创建一个自定义对象来存储这些值并具有将其输出到 JSON 字符串(用于存储在 Prefs 中)并通过接收 JSON 字符串进行重构的方法。您还可以使用返回对象图像的方法。这是我写的一个示例类:

public class MyObject {
    private static final String IMAGE_RES_ID = "ImageResId";
    private static final String STRING1 = "String1";
    private static final String STRING2 = "String2";
    private static final String INT_ARRAY = "IntArray";
    private static final String STRING_ARRAY = "StringArray";

    private int mImageResId;
    private String mString1, mString2;
    private int[] mIntArray;
    private String[] mStringArray;

    public MyObject(int imageResId, String s1, String s2, int[] intArray,
            String[] stringArray) {
        mImageResId = imageResId;
        mString1 = s1;
        mString2 = s2;
        mIntArray = intArray;
        mStringArray = stringArray;
    }

    public MyObject(String jsonString) throws JSONException {
        JSONObject jsonObject = new JSONObject(jsonString);

        // Get single values
        mImageResId = jsonObject.getInt(IMAGE_RES_ID);
        mString1 = jsonObject.getString(STRING1);
        mString2 = jsonObject.getString(STRING2);

        // Get arrays
        JSONArray intArray = jsonObject.getJSONArray(INT_ARRAY);
        mIntArray = new int[intArray.length()];
        for (int i = 0; i < mIntArray.length; i++)
            mIntArray[i] = intArray.getInt(i);

        JSONArray stringArray = jsonObject.getJSONArray(STRING_ARRAY);
        mStringArray = new String[stringArray.length()];
        for (int i = 0; i < mStringArray.length; i++)
            mStringArray[i] = stringArray.getString(i);
    }

    public int getImageResId() {
        return mImageResId;
    }

    public String getString1() {
        return mString1;
    }

    public String getString2() {
        return mString2;
    }

    public int[] getIntArray() {
        return mIntArray;
    }

    public String[] getStringArray() {
        return mStringArray;
    }

    public Drawable getImageDrawable(Context context) {
        return context.getResources().getDrawable(getImageResId());
    }

    private JSONObject toJsonObject() throws JSONException{
        JSONObject toReturn = new JSONObject();

        // Put single values
        toReturn.put(IMAGE_RES_ID, getImageResId());
        toReturn.put(STRING1, getString1());
        toReturn.put(STRING2, getString2());

        // Put arrays
        JSONArray intArray = new JSONArray();
        for (int value : mIntArray)
            intArray.put(value);

        JSONArray stringArray = new JSONArray();
        for (String value : mStringArray)
            stringArray.put(value);

        toReturn.put(INT_ARRAY, intArray);
        toReturn.put(STRING_ARRAY, stringArray);

        return toReturn;
    }

    public String toJsonString() throws JSONException {
        return toJsonObject().toString();
    }
}

一旦你拥有了你想要保存的所有相关信息,就构建它。然后将 toJsonString() 的结果存储在 SharedPreferences 中,并在需要时在运行时恢复。

于 2012-11-15T17:12:41.227 回答