Как объединить наборы изображений, строк и целых чисел в удобном для обслуживания формате - PullRequest
4 голосов
/ 18 марта 2012

Итак, я пытаюсь найти наилучший способ объединения множества типов данных. Внутри моего кода я создаю класс. Внешне я хочу иметь единственное место для управления следующими типами данных или, по крайней мере, указателями на эти данные. Обратите внимание, что наборов этих данных очень много, и я ожидаю, что их будет добавляться по мере продолжения.

РЕДАКТИРОВАТЬ: я значительно упрощаю то, что когда-то было здесь.

Представьте, что во время компиляции у меня есть список объектов. Каждый объект имеет некоторую характеристику, которая будет общей для всех объектов. К ним относятся:

  • Изображение image
  • Некоторые строки
  • Массив целых чисел
  • Массив строк

Я хочу найти способ хранить все это вместе вне любого кода. В идеале я хотел бы использовать 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, если можно найти лучшее решение. Все, что мне нужно, - это какая-то отдельная база данных для доступа к этой информации.

Эти данные не должны изменяться, если я не отправлю новое обновление. Их не нужно обновлять во время выполнения, но я определенно хотел бы обновлять их между сборками, время от времени ... Я слышал о Предпочтениях, которые могут работать, но я не уверен, что они могут быть каким-либо образом обновляемыми пользователем .

Ответы [ 3 ]

2 голосов
/ 16 ноября 2012

Я смог найти решение при значительной помощи этого вопроса .

  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 и получив идентификатор ресурса:

int resid=Context.getResources().getIdentifier (name_string_Image, "drawable", null);
1 голос
/ 15 ноября 2012

Я думаю, вы могли бы создать пользовательский объект, который хранит эти значения и имеет метод для вывода его в строку 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 и восстановите во время выполнения при необходимости.

1 голос
/ 18 марта 2012

SharedPreferences является опцией, но в этом случае позже, даже если вам просто нужно изменить значения, вам придется внести изменения в ваш код. Способ XML, с другой стороны, более гибкий.

В будущем, если вы просто захотите изменить значения параметров, измените файл XML и отправьте его на телефоны своих пользователей. Не нужно менять код, проходить циклы тестирования и т. Д. И если вы хотите добавить / удалить материал, то любой из этих способов потребует изменения в коде (особенно в части добавления)

Затраты на xml ofcourse будут частью чтения / записи.

...