2012-03-18 6 views
4

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

EDIT: Я значительно упрощаю то, что было здесь.

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

  • An imageImage
  • Некоторые строки
  • Массив Целые
  • Массив строк

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

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

+0

Так что я получаю то, что эти вещи, которые вы не хотите пользователь должен изменить, но вы хотите, чтобы они были доступны до тех пор, пока приложение существует. Если вы обновите свой код, чтобы изменить эти значения, только тогда они должны быть обновлены? – Shubhayu

+0

@Shubhayu: Ну, я хочу иметь возможность обновлять их для будущих выпусков, добавлять/удалять/изменять вещи, но я определенно не хочу, чтобы пользователь мог их обновлять. Однако я не буду обновлять их во время выполнения. – PearsonArtPhoto

+0

Возможно, я не могу полностью понять вопрос. Однако, если вы создали подкласс объекта, который сохранил всю эту информацию, тогда напишите метод, который помещает все это в объект JSON, а затем сохранит String этого объекта JSON в Preferences. Тогда, конечно, вы должны написать методы десериализации, чтобы повторно построить объект из строки JSON во время выполнения. Звучит ли это звук удаленно для вашей ситуации? – dennisdrew

ответ

2

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

  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> 

У меня есть файл в моем разрешении/значения папку, которая выглядит как:

<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); 
} 

В качестве альтернативы, я мог бы просто сохранить имя i маг, как показано ниже:

<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

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

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

Накладные расходы для xml курса, будет частью читателя/писателя.

+0

Я не беспокоюсь о накладных расходах во время выполнения, поскольку все это будет сделано при инициализации, но меня беспокоит ремонтопригодность.Тем не менее, я не могу понять, как включить файлы изображений ... – PearsonArtPhoto

+0

Да, файлы изображений будут сложными. Лучшим способом было бы включить изображения в выпадающую папку и сохранить идентификаторы/имена в виде строки в вашем выборе сохранения настроек. Я предлагаю это, я думаю, у вас не слишком много изображений. – Shubhayu

+0

У меня возникли проблемы с разбором ... У меня есть изображения, сохраненные в папке с возможностью переноса, но я не знаю, как передать их в файл XML ... – PearsonArtPhoto

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 и при необходимости восстановите его во время выполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^