Speichern Sie benutzerdefinierte Objekt in den shared preferences
Ich wollen speichern Sie ein benutzerdefiniertes Objekt myObject
in shared preferences. Wo dieses benutzerdefinierte Objekt hat ArrayList<anotherCustomObj>
. Diese anotherCustomObj
hat primäre Variablen.
Beide myObject
und anotherCustomObj
sind parcelable.
Ich habe versucht, folgenden code für die Konvertierung in einen String und speichern Sie es :
String myStr = gson.toJson(myObject);
editor.putString(MY_OBJ, myStr);
Aber es gibt RunTimeException.
EDIT : Unten ist logcat Screenshot.
anotherCustomObj Umsetzung :
package com.objectlounge.ridesharebuddy.classes;
import java.io.File;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.gson.annotations.SerializedName;
import com.objectlounge.ridesharebuddy.R;
public class RS_SingleMatch implements Parcelable {
private static final String RIDESHARE_DIRECTORY = "RideShareBuddy";
private static final String TAG = "RS_SingleMatch";
private static final String IMAGE_PATH = "imagePath";
private static final String IMAGE_NAME_PREFIX = "RideShareBuddyUserImage";
private Context context;
@SerializedName("id")
private int userId;
private int tripId;
private String imageUrl;
@SerializedName("userName")
private String email;
private String realName;
private String gender;
private int reputation;
private String createdAt;
private String birthdate;
private float fromLat, fromLon, toLat, toLon;
private String fromPOI, toPOI;
private String departureTime;
private int matchStrength;
//Constructor
public RS_SingleMatch(Context context) {
this.context = context;
}
//Constructor to use when reconstructing an object from a parcel
public RS_SingleMatch(Parcel in) {
readFromParcel(in);
}
@Override
public int describeContents() {
return 0;
}
@Override
//Called to write all variables to a parcel
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(userId);
dest.writeInt(tripId);
dest.writeString(imageUrl);
dest.writeString(email);
dest.writeString(realName);
dest.writeString(gender);
dest.writeInt(reputation);
dest.writeString(createdAt);
dest.writeString(birthdate);
dest.writeFloat(fromLat);
dest.writeFloat(fromLon);
dest.writeFloat(toLat);
dest.writeFloat(toLon);
dest.writeString(fromPOI);
dest.writeString(toPOI);
dest.writeString(departureTime);
dest.writeInt(matchStrength);
}
//Called from constructor to read object properties from parcel
private void readFromParcel(Parcel in) {
//Read all variables from parcel to created object
userId = in.readInt();
tripId = in.readInt();
imageUrl = in.readString();
email = in.readString();
realName = in.readString();
gender = in.readString();
reputation = in.readInt();
createdAt = in.readString();
birthdate = in.readString();
fromLat = in.readFloat();
fromLon = in.readFloat();
toLat = in.readFloat();
toLon = in.readFloat();
fromPOI = in.readString();
toPOI = in.readString();
departureTime = in.readString();
matchStrength = in.readInt();
}
//This creator is used to create new object or array of objects
public static final Parcelable.Creator<RS_SingleMatch> CREATOR = new Parcelable.Creator<RS_SingleMatch>() {
@Override
public RS_SingleMatch createFromParcel(Parcel in) {
return new RS_SingleMatch(in);
}
@Override
public RS_SingleMatch[] newArray(int size) {
return new RS_SingleMatch[size];
}
};
//Getters
public int getUserId() {
return userId;
}
public int getTripId() {
return tripId;
}
public String getImageUrl() {
return imageUrl;
}
public Bitmap getImage() {
Bitmap image = null;
//If imageUrl is not empty
if (getImageUrl().length() > 0) {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(this.context);
String imagePath = prefs.getString(IMAGE_PATH + getUserId(), "");
//Get image from cache
if ((image = RS_FileOperationsHelper.getImageAtPath(imagePath)) == null) {
Log.d(TAG, "Image not found on disk.");
Thread t = new Thread(new Runnable() {
@Override
public void run() {
//If image not found on storage then download it
setImage(downloadImage(getImageUrl()));
}
});
t.start();
}
} else {
//Use default image
image = getDefaultProfileImage();
}
image = RS_ImageViewHelper.getRoundededImage(image, image.getWidth());
Log.d(TAG, "Image width : " + image.getWidth());
return image;
}
public String getEmail() {
return email;
}
public String getRealName() {
return realName;
}
public String getGender() {
return gender;
}
public int getReputation() {
return reputation;
}
public String getCreatedAt() {
return createdAt;
}
public String getBirthdate() {
return birthdate;
}
public float getFromLat() {
return fromLat;
}
public float getFromLon() {
return fromLon;
}
public float getToLat() {
return toLat;
}
public float getToLon() {
return toLon;
}
public String getFromPOI() {
return fromPOI;
}
public String getToPOI() {
return toPOI;
}
public String getDepartureTime() {
return departureTime;
}
public int getMatchStrength() {
return matchStrength;
}
//Setters
public void setContext(Context context) {
this.context = context;
}
public void setUserId(int userId) {
this.userId = userId;
}
public void setTripId(int tripId) {
this.tripId = tripId;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public void setImage(Bitmap img) {
if (img != null) {
//Get cache directory's path and append RIDESHARE_DIRECTORY.
String cacheDirStoragePath = context.getCacheDir()
+ "/"
+ RIDESHARE_DIRECTORY;
//Create directory at cacheDirStoragePath if does not exist.
if (RS_FileOperationsHelper
.createDirectoryAtPath(cacheDirStoragePath)) {
String imagePath = cacheDirStoragePath + "/"
+ IMAGE_NAME_PREFIX + this.userId + ".png";
//Save new image to cache
RS_FileOperationsHelper.saveImageAtPath(img, imagePath, this.context);
SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(context);
Editor e = pref.edit();
e.putString(IMAGE_PATH + getUserId(), imagePath);
e.commit();
}
}
}
public void setEmail(String email) {
this.email = email;
}
public void setRealName(String realName) {
this.realName = realName;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setReputation(int reputation) {
this.reputation = reputation;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
public void setFromLat(float fromLat) {
this.fromLat = fromLat;
}
public void setFromLon(float fromLon) {
this.fromLon = fromLon;
}
public void setToLat(float toLat) {
this.toLat = toLat;
}
public void setToLon(float toLon) {
this.toLon = toLon;
}
public void setFromPOI(String fromPOI) {
this.fromPOI = fromPOI;
}
public void setToPOI(String toPOI) {
this.toPOI = toPOI;
}
public void setDepartureTime(String departureTime) {
this.departureTime = departureTime;
}
public void setMatchStrength(int matchStrength) {
this.matchStrength = matchStrength;
}
//calculates age using given date
@SuppressLint("SimpleDateFormat")
public int calculateAge(String date) {
int age = 0;
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date bdate = formatter.parse(date);
Calendar lCal = Calendar.getInstance();
lCal.setTime(bdate);
int lYear = lCal.get(Calendar.YEAR);
int lMonth = lCal.get(Calendar.MONTH) + 1;
int lDay = lCal.get(Calendar.DATE);
Calendar dob = Calendar.getInstance();
Calendar today = Calendar.getInstance();
dob.set(lYear, lMonth, lDay);
age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) {
age--;
}
} catch (ParseException e) {
e.printStackTrace();
}
return age;
}
//Download image if not available
protected void downloadAndSaveImage() {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(this.context);
String imagePath = prefs.getString(IMAGE_PATH + getUserId(), "");
File file = new File(imagePath);
//If image path not stored in user defaults or image does not exists
//then
if ((imagePath == null || !file.exists()) && this.imageUrl.length() > 0) {
//Download on separate thread
Thread t = new Thread(new Runnable() {
@Override
public void run() {
setImage(downloadImage(getImageUrl()));
}
});
t.start();
}
}
//Download an image
private Bitmap downloadImage(String imageUrl) {
Log.d(TAG, "Image url : " + imageUrl);
Bitmap image = null;
try {
//Download an image from url
InputStream in = new java.net.URL(imageUrl.trim()).openStream();
image = BitmapFactory.decodeStream(in);
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, "Image downloading complete. image : " + image);
return image;
}
//Get default image
protected Bitmap getDefaultProfileImage() {
Bitmap image = BitmapFactory.decodeResource(
this.context.getResources(), R.drawable.default_male);
if (this.gender.toUpperCase(Locale.US).startsWith("F")) {
image = BitmapFactory.decodeResource(this.context.getResources(),
R.drawable.default_female);
}
return image;
}
}
- setzen exception log hier
- Schauen Sie bitte auf bearbeitete Frage.
- Ich habe bereits die Frage gestellt, für, die. Wenn Sie möchten schauen : stackoverflow.com/questions/19294555/...
- Der Fehler-Linie, die Sie ergreifen sollten, zu berücksichtigen ist: Verursacht durch: IllegalArgumentException: class BorindLayout erklärt mehrere JSON-Felder mit den Namen mPaint.
- Ich sah es. Konnte nicht verstehen, was BorindLayout und mPaint ist. Können Sie das erklären?
- stackoverflow.com/questions/15410037/... überprüfen. "Aus irgendeinem Grund, diese Bibliothek nicht serialisieren view-Komponenten nicht mehr."
- Aber mein Gegenstand ist nicht eine view-Komponente.
- fügen Sie dann die Struktur Ihres Objekts.
- lassen Sie uns weiter, diese Diskussion im chat
- Gibt es irgendeine andere Möglichkeit, das speichern von benutzerdefinierten Objekt?
- Ich hatte eine view-Komponente. Bitmap. Ich bemerkte es noch immer Fehler. Ich bin Entsendung ganze Klasse Umsetzung des benutzerdefinierten Objekts.
- haben Sie gesehen, stackoverflow.com/questions/5418160/...
- warum Sie möchten, speichern Sie benutzerdefinierte Objekte geteilt werden, pref...gemeinsame pref besser ist, speichern Sie einfach Daten .. dieses tutorial developer.android.com/reference/android/content/...
- Da meine Aktivität wird zerstört werden, für einige Grund, und neu erstellt. Wenn es ist neu, ich nicht alte-Variablen. Das ist, warum ich brauchen, um zu speichern es vorübergehend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Link gepostet von damian war hilfreich, um mein problem zu lösen. Aber in meinem Fall gab es keine view-Komponenten in benutzerdefinierten Objekts.
Nach meiner Beobachtung, wenn Sie finden
multiple JSON fields for ANY_VARIABLE_NAME
, dann ist es wahrscheinlich, dass es ist, weil GSON ist nicht in der Lage, konvertieren Sie das Objekt. Und Sie können versuchen, die folgenden code, um es zu lösen.Fügen Sie unter der Klasse zu erzählen GSON zu speichern und/oder abrufen, werden nur diejenigen Variablen, die Serialisiert Namen erklärt.
Unten ist die Klasse, deren Objekt Sie brauchen, um zu speichern/abzurufen.
Hinzufügen
@SerializedName
für Variablen, die muss gespeichert und/oder abgerufen werden.Code zu konvertieren myObject zu jsonString :
Code zum Objekt von jsonString :