2016-04-29 6 views
2

Ich versuche, eine Arraylist von Clients in freigegebenen Einstellungen zu speichern, jedoch bekomme ich einen Speicherfehler. Ich bin neu und kann nicht herausfinden, wie das geht? Ich habe viele Seiten im Stackoverflow betrachtet, konnte aber keine finden, die für mich funktionieren würden oder die auch eine ArrayList von benutzerdefinierten Objekten haben, wobei jedes Objekt mehr ArrayLists mit benutzerdefinierten Objekten enthält.Speichern einer Arraylist von benutzerdefinierten Objekten (die Zeichenfolgen, Daten, Listen und mehr als Felder enthalten) in freigegebenen Einstellungen

Client-Objekt:

public class Client implements Serializable, Comparable<Client> { 
    private int clientID; 
    private String name; 
    private String phone; 
    private String email; 
    private String url; 
    private Double turnover; 
    private String visitAddress; 
    private String visitCity; 
    private String visitZipcode; 
    private String visitCountry; 
    private String postalAddress; 
    private String postalCity; 
    private String postalZipcode; 
    private String postalCountry; 
    private Drawable clientImage; 
    private List<Contact> contactList = new ArrayList<Contact>(); 
    private List<Project> projectList = new ArrayList<Project>(); 
    private List<Task> taskList = new ArrayList<Task>(); 
    private List<Order> orderList = new ArrayList<Order>(); 


    public Client(int clientID, String Name, String Phone, String Email, String URL, Double Turnover, 
        String VisitAddress, String VisitCity, String VisitZipcode, String VisitCountry, 
        String PostalAddress, String PostalCity, String PostalZipcode, String PostalCountry, 
        List contactList, List projectList, List taskList, List orderList){ 
      super(); 
     this.clientID = clientID; 
     this.name = Name; 
      this.phone = Phone; 
      this.email = Email; 
      this.url = URL; 
      this.turnover = Turnover; 
      this.visitAddress = VisitAddress; 
      this.visitCity = VisitCity; 
      this.visitZipcode = VisitZipcode; 
      this.visitCountry = VisitCountry; 
      this.postalAddress = PostalAddress; 
      this.postalCity = PostalCity; 
      this.postalZipcode = PostalZipcode; 
      this.postalCountry = PostalCountry; 
      this.contactList = contactList; 
      this.projectList = projectList; 
      this.taskList = taskList; 
      this.orderList = orderList; 
    } 


    public String getName() { 
     return name; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public Double getTurnover() { 

     return turnover; 
    } 

    public String getVisitAddress() { 
     return visitAddress; 
    } 

    public String getVisitCity() { 
     return visitCity; 
    } 

    public String getVisitZipcode() { 
     return visitZipcode; 
    } 

    public String getVisitCountry() { 
     return visitCountry; 
    } 

    public String getPostalAddress() { 
     return postalAddress; 
    } 

    public String getPostalCity() { 
     return postalCity; 
    } 

    public String getPostalZipcode() { 
     return postalZipcode; 
    } 

    public String getPostalCountry() { 
     return postalCountry; 
    } 

    public List<Contact> getContactList(){ 
     return contactList; 
    } 

    public List<Project> getProjectList(){ 
     return projectList; 
    } 

    public List<Task> getTaskList(){ 
     return taskList; 
    } 

    public List<Order> getOrderList() { 
     return orderList; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public void setTurnover(Double turnover) { 
     this.turnover = turnover; 
    } 

    public void setVisitAddress(String visitAddress) { 
     this.visitAddress = visitAddress; 
    } 

    public void setVisitCity(String visitCity) { 
     this.visitCity = visitCity; 
    } 

    public void setVisitZipcode(String visitZipcode) { 
     this.visitZipcode = visitZipcode; 
    } 

    public void setVisitCountry(String visitCountry) { 
     this.visitCountry = visitCountry; 
    } 

    public void setPostalAddress(String postalAddress) { 
     this.postalAddress = postalAddress; 
    } 

    public void setPostalCity(String postalCity) { 
     this.postalCity = postalCity; 
    } 

    public void setPostalZipcode(String postalZipcode) { 
     this.postalZipcode = postalZipcode; 
    } 

    public void setPostalCountry(String postalCountry) { 
     this.postalCountry = postalCountry; 
    } 

    public Drawable getClientImage() { 
     return clientImage; 
    } 

    public void setClientImage(Drawable clientImage) { 
     this.clientImage = clientImage; 
    } 

    public int getClientID() { 
     return clientID; 
    } 

    public void setClientID(int clientID) { 
     this.clientID = clientID; 
    } 

zugrunde liegenden Projektobjekt: (auch mit Liste der benutzerdefinierten Objekte)

public class Project implements Serializable, Comparable<Project>{ 

    private String clientName; 
    private String projectName; 
    private String projectDiscription; 
    private String projectStatus; 
    private GregorianCalendar projectDate; 
    private List<TimeSheet> projectTimeRegestrationList = new ArrayList<>(); 
    private List<WorkOrder> workOrderList = new ArrayList<WorkOrder>(); 


    public Project(String clientName, String projectName, String projectDiscription, String projectStatus, GregorianCalendar projectDate, List projectTimeRegestrationList, List workOrderList) { 
     this.projectName = projectName; 
     this.projectDiscription = projectDiscription; 
     this.projectStatus = projectStatus; 
     this.projectDate = projectDate; 
     this.clientName = clientName; 
     this.projectTimeRegestrationList = projectTimeRegestrationList; 
     this.workOrderList = workOrderList; 
    } 

    public String getProjectName() { 
     return projectName; 
    } 

    public void setProjectName(String projectName) { 
     this.projectName = projectName; 
    } 

    public String getProjectDiscription() { 
     return projectDiscription; 
    } 

    public void setProjectDiscription(String projectDiscription) { 
     this.projectDiscription = projectDiscription; 
    } 

    public String getProjectStatus() { 
     return projectStatus; 
    } 

    public void setProjectStatus(String projectStatus) { 
     this.projectStatus = projectStatus; 
    } 

    public GregorianCalendar getProjectDate() { 
     return projectDate; 
    } 

    public void setProjectDate(GregorianCalendar projectDate) { 
     this.projectDate = projectDate; 
    } 

    public String getClientName() { 
     return clientName; 
    } 

    public void setClientName(String clientName) { 
     this.clientName = clientName; 
    } 

    public List<TimeSheet> getProjectTimeRegestrationList() { 
     return projectTimeRegestrationList; 
    } 

    public List<WorkOrder> getWorkOrderList() { 
     return workOrderList; 
    } 

jetzt meine konkrete Frage: Ist es möglich, diese in gemeinsam genutzten Einstellungen zu speichern, wenn ja , wie mache ich das, wenn nein, wie soll ich dann diese Daten lokal sichern?

+0

Verwenden Gson Bibliothek Ihr Objekt jSON-String und umgekehrt zu konvertieren. Und speichern Sie die Zeichenfolge in den Einstellungen. – USKMobility

+0

@USKMobility, das funktioniert nicht für mich, ich bekomme ein OutOfMemoryError, aber funktioniert auch für benutzerdefinierte Objekte, die Listen mit benutzerdefinierten Objekten enthalten, die auch Listen mit benutzerdefinierten Objekten enthalten –

+0

Sie können Ihre Daten immer irgendwo in Dateien speichern Projekt oder auf bestimmten Pfad in Ihrem Computer. –

Antwort

0

Sie json verwenden können sie als String in sharedpreference speichern

zum Beispiel, wenn Sie ein Objekt Ihrer Client-Klasse contaning eine URL, Land und Mobiltelefon speichern möchten

schreiben Sie einfach den folgenden

try { 
       JSONArray jsonArray=new JSONArray(); 
       JSONObject object1=new JSONObject(); 
       object1.put("url","myurl"); 
       object1.put("phone","myphonenumber"); 
       object1.put("country","mycountry"); 
       jsonArray.put(object1); 

       //adding another object 
       JSONObject object2=new JSONObject(); 
       object2.put("url","anotherurl"); 
       object2.put("phone","anotherphonenumber"); 
       object2.put("country","anothercountry"); 
       jsonArray.put(object2); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

und als einfach als String speichern, indem jsonArray.toString() in sharedpreference

Aufruf und wenn Ihr Objekt dass Sie speichern möchten, enthält eine Liste eines anderen Objekts, das Sie einfach speichern können, z. B. wenn Sie eine URL, ein Land und eine Telefonnummer sowie eine Liste mit einem anderen Objekt mit dem Vor- und Nachnamen speichern möchten json Objekt selbst genau wie Sie für die uRL haben, die Telefonnummer und Land, wie unten

gezeigt
try { 
       JSONArray jsonArray=new JSONArray(); 
       JSONObject object1=new JSONObject(); 
       object1.put("url","myurl"); 
       object1.put("phone","myphonenumber"); 
       object1.put("country","mycountry"); 

       //saving a list of another object contaning firstname and lastname 
       JSONArray listArray=new JSONArray(); 

       //supposing your list contains 10 objects 
       for(int f=0;f<10;f++){ 
        JSONObject listobject=new JSONObject(); 
        listobject.put("firstname","myfirstname"); 
        listobject.put("lastname","mylastname"); 
        listArray.put(listobject); 
       } 
       //now the list array we added as an object of the jsonArray variable 
       JSONObject object2=new JSONObject(); //object2 containing the list of firstname and lastname 
       object2.put("list",listArray.toString()); 
       jsonArray.put(object1);//object1 contains the url, phone, and country 
       jsonArray.put(object2);//object2 contains the list of firstname and lastname 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
+0

das ist eine gute Methode, die so lange funktioniert, wie die Hierarchie nicht so tief geht, endete damit nach einer irgendwie massiven Strukturänderung, weil meine Hierarchie etwa 5 Arraylisten von benutzerdefinierten Objekten tief ging. und das funktioniert nur toll mit 2 höchstens. Aber ist das der einzige Weg, und habe ich meine App zuerst wirklich dumm aufgebaut, oder gibt es eine gute Möglichkeit, Arraylisten von benutzerdefinierten Objekten mit einer sehr tiefen Hierarchie zu speichern. –

+0

@ D.Blazer nein kann es so tief arbeiten, wie Sie wollen, können Sie gerne eine Funktion hinzufügen, die Sie ein Jsonobject für jede Klasse und eine andere Funktion, die Sie zurückgibt ein Jsonarray einer Arraylist von Objekten dieser Klasse, die Sie einfach zurückgeben als ein anderes jsonobject. Ich habe es bereits getan, um eine Klasse zu speichern, die mindestens 4 Arraylist verschiedener Objekte enthält, aber es wird mehr Arbeit als die Verwendung von Serializable erfordern, aber es ist überhaupt nicht schwer – has19

+0

Sie haben Recht, danke Alter, hat es funktioniert –