1) Kopieren Sie diesen Code in Ihrem Projekt
import android.util.Log;
import java.lang.reflect.Method;
import io.realm.RealmList;
import io.realm.RealmObject;
import com.company.project.models.IRealmCascade;
/**
*/
public class RealmUtils
{
public static void deleteCascade(RealmObject dataObject)
{
if (dataObject == null)
{
return;
}
if(IRealmCascade.class.isAssignableFrom(dataObject.getClass()))
{
for(Method method : dataObject.getClass().getSuperclass().getDeclaredMethods())
{
try {
//Ignore generated methods
if((method.getName().contains("realmGet$")) || (method.getName().contains("access$super")))
{
continue;
}
Class<?> resultType = method.getReturnType();
//Ignore non object members
if (resultType.isPrimitive()) {
continue;
}
if (RealmObject.class.isAssignableFrom(resultType)) {
//Delete Realm object
try {
RealmObject childObject = (RealmObject) method.invoke(dataObject);
RealmUtils.deleteCascade(childObject);
} catch (Exception ex) {
Log.e("REALM", "CASCADE DELETE OBJECT: " + ex.toString());
}
} else if (RealmList.class.isAssignableFrom(resultType)) {
//Delete RealmList items
try {
RealmList childList = (RealmList) method.invoke(dataObject);
while(childList.iterator().hasNext())
{
RealmObject listItem = (RealmObject)childList.iterator().next();
RealmUtils.deleteCascade(listItem);
}
} catch (Exception ex) {
Log.e("REALM", "CASCADE DELETE LIST: " + ex.toString());
}
}
}
catch (Exception ex)
{
Log.e("REALM", "CASCADE DELETE ITERATION: " + ex.toString());
}
}
}
dataObject.deleteFromRealm();
}
}
2) In-Schnittstelle zu Ihrem Projekt. Wenn Ihr Realm-Objekt diese Schnittstelle implementiert, werden alle untergeordneten Objekte nach dem Aufruf von deleteCascade gelöscht. Wenn die Schnittstelle nicht implementiert ist, löscht diese Funktion Realm-Objekte, löscht jedoch keine untergeordneten Objekte.
public interface IRealmCascade {
}
3) Deklarieren Sie Ihr Realm-Objekt. Beispiel unten.
public class NodeModel extends RealmObject implements IRITSerializable, IRealmCascade {
@PrimaryKey
@SerializedName("id") private String objId;
@SerializedName("parentId") private String parentId;
@SerializedName("contentType") private String nodeType;
@Required
@SerializedName("name") private String name;
@SerializedName("settings") private RealmList<ValueTypeModel> columns;
public String getObjId() {
return objId;
}
public void setObjId(String objId) {
this.objId = objId;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getNodeType() {
return nodeType;
}
public void setNodeType(String nodeType) {
this.nodeType = nodeType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public RealmList<ValueTypeModel> getColumns() {
return columns;
}
public void setColumns(RealmList<ValueTypeModel> columns) {
this.columns = columns;
}
}
4) Sie müssen RealmUtils.deleteCascade (realmObject nennen); stattdessen realmObject.removeFromRealm(); Beispiel unter Aktualisierungsdaten in der lokalen Datenbank
for(NodeModel nodeItem: incomingData.getNodesList())
{
RealmResults<NodeModel> results = bgRealm.where(NodeModel.class).equalTo("objId", nodeItem.getObjId()).findAll();
if (results.size() > 0)
{
RealmUtils.deleteCascade(results.first());
}
bgRealm.copyToRealm(nodeItem);
}
Genießen Sie Ihre saubere DB! :)
Stack-Überlauf ist für die Programmierung von Fragen. Was ist deine Frage? – CommonsWare
Lassen Sie mich es beenden ... Ich veröffentliche es. –