Сохранение пользовательских объектов

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

            ArrayList<String> countryName = new ArrayList<String>();

    json_string = loadJSONFromAsset();

    {
        // Locate the WorldPopulation Class
        world = new ArrayList<SignUp>();

        // Create an array to populate the spinner
        worldlist = new ArrayList<String>();



        try {
            // JSON file Assert Folder
            jsonobject = new JSONObject(json_string);
            // Locate the NodeList name
            jsonarray = jsonobject.getJSONArray("countries");
            for (int i = 0; i < jsonarray.length(); i++) {
                jsonobject = jsonarray.getJSONObject(i);

                SignUp worldpop = new SignUp();
                worldpop.setCountry(jsonobject.optString("name"));
                worldpop.setCountry_phone_Code(jsonobject.optString("dial_code"));
                worldpop.setCountry_Code(jsonobject.optString("code"));
                world.add(worldpop);
                // Populate spinner with country names
                worldlist.add(jsonobject.optString("name"));

            }
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_dropdown_item, worldlist);

    spinner = (Spinner)findViewById(R.id.spinner);
    spinner.setOnItemSelectedListener(this);
    spinner.setAdapter(adapter);

 }

  public void onItemSelected(AdapterView<?> parent, View view, int position,
                           long id) {


    String CountryPhone = world.get(position).getCountry_phone_Code();
    TextDialCode.setText(CountryPhone);

    country = world.get(position).getCountry();

}

это моя модель

public class SignUp {

public String country;
public String country_code;
public String country_phone_code;

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}


public String getCountry_Code() {
    return country_code;
}

public String getCountry_phone_Code() {
    return country_phone_code;
}


public void setCountry_Code(String country_code) {
    this.country_code = country_code;
}

public void setCountry_phone_Code(String country_phone_code) {
    this.country_phone_code = country_phone_code;
}


}
10
задан David 22 May 2015 в 20:43
поделиться

2 ответа

NSCoding сделает точно, что Вы хотите. Я рекомендую читать на нем в документах Apple, но я думал, что это было довольно просто для использования. Ваш класс (и любые дочерние классы) должен будет реализовать NSCoding протокол и Вы должны будете добавить -encodeWithCoder: и -initWithCoder: методы к Вашим объектам. Большая часть реализации классов общих основ NSCoding уже.

Код для Вашего класса будет выглядеть примерно так:

-(void) encodeWithCoder: (NSCoder*) coder {
  [coder encodeInteger: versionValue forKey: versionKey];
  [coder encodeObject: myStuff forKey: myStuffKey];
}

-(id) initWithCoder: (NSCoder*) coder {
  self = [super init];
  if ( ! self) return nil;
  myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
  return self;
}

Это рекомендовало добавить номер версии при кодировании, чтобы дать Вам гибкость для управления изменениями в формате архива в будущих версиях.

В моем классе я добавил удобный метод заархивировать мой объект:

-(void) archiveToFile: (NSString*) path {
  NSMutableData *data = [[NSMutableData alloc] init];
  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
  [archiver encodeObject: self forKey: myArchiveKey];
  [archiver finishEncoding];
  [archiver release];
  [data writeToFile: path atomically: YES];
  [data release];
}

и другой, чтобы разархивировать или создать новый объект:

+(MyArchive*) newFromFile: (NSString*) path
            orWithMyStuff: (MyStuff*) myStuff
{
  NSData *data = [[NSData alloc] initWithContentsOfFile: path];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
  MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
  [unarchiver finishDecoding];

  if (myArchive) {
    [myArchive retain];
  } else {
    myArchive = [[MyArchive alloc] initWithStuff: myStuff;
  }
  [unarchiver release];
  [data release];
  return myArchive;
}

Так как Ваш объект верхнего уровня NSArray, необходимо будет изменить последние два метода для случая, но большая часть шаблонного кода будет тем же.

21
ответ дан 3 December 2019 в 18:36
поделиться

Если Вы собираетесь хотеть получить подмножество объектов, SQLite является безусловно Вашим лучшим выбором.

В противном случае это - выбор между plist форматом, и NSCoding. plist требует, чтобы Вы смогли преобразовать свои пользовательские объекты во что-то plist-дружественное и затем преобразовать plist назад в Ваши объекты, но NSCoding немного более тверд перенести Вашу голову и не может быть легко отредактирован (или исследован), вручную.

0
ответ дан 3 December 2019 в 18:36
поделиться