2017-05-14 1 views
1

Ich habe mehrere Klassen (z. B. Realm-Tabellen). Ich verarbeite jedes auf die gleiche Weise (siehe Code unten).Klassenverarbeitung, wiederkehrender Code

Ändern Sie nur den Namen der Klasse: Ticket.class, weiter wird es SecondTable.class und so weiter. Klassennamen sind im Voraus bekannt.

Q1. Wie mache ich eine Methode mit einer Klasse als Argument?

Q2. Oder wie kann ich etwas wie "für jeden [Klassen] tun ..." tun?

Realm realm = Realm.getDefaultInstance(); 
RealmResults<Ticket> tickets = realm.where(Ticket.class).findAll(); 
realm.beginTransaction(); 
for (int i = tickets.size() - 1; i >= 0; i--) { 
    if ... { 
     Notification notification = new NotificationCompat.Builder(this)...; 
     StartMyAsyncTask().execute(tickets.get(i)); 
     // etc... 

     // delete from DB 
     tickets.get(i).removeFromRealm(); 
    } 
} 
realm.commitTransaction(); 

Und die Ticket Klasse wie folgt aussieht:

public class Ticket extends RealmObject {... } 
+0

öffnen Sie die Transaktion ** vor ** die Abfrage – EpicPandaForce

Antwort

2

Sie können eine Union Schnittstelle erstellen:

public interface IAction { 
    void action(); 
} 

für Ticket und SecondTable und implementieren diese:

public class Ticket extends RealmObject implements IAction { 

    @Override 
    public void action(){...} 
} 

Die Nächster Schritt ist eine Vorlage Methode (wahrscheinlich in Ihrem Utils Klasse):

public static <T extends RealmObject & IAction> void yorForEachMethod(Class<T> cls) { 
    Realm realm = Realm.getDefaultInstance(); 
    RealmResults realmObjects = realm.where(cls).findAll(); 
    realm.beginTransaction(); 
    for (int i = realmObjects.size() - 1; i >= 0; i--) { 
     if ... { 
      Notification notification = new NotificationCompat.Builder(this)...; 
      // you can evaluate implementation of action method from IAction interface 
      ((IAction)realmObjects.get(i)).action(); 
      // or pass to assync task and work with IAction interface 
      //StartMyAsyncTask().execute((IAction)realmObjects.get(i)); 
      // etc... 

      // delete from DB 
      realmObjects.get(i).removeFromRealm(); 
     } 
    } 
    realm.commitTransaction(); 
} 
+1

Vielen Dank! Es funktionierte. – tim4dev

+0

@ tim4dev, Sie sind herzlich willkommen!) Sie sollten die Antwort als akzeptiert markieren, wenn sie Ihre Frage beantwortet hat. https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Sergey

0

1.You kann ein Verfahren mit Klasse als Object erstellen:

public void yourMethod(Object yourclass) {} 

2.Since Sie Objekt jede Aktualisierung wird und jedes Mal. Erstellen Sie eine neue Instanz und rufen Sie die oben generierte Methode:

yourMethodClass.yourMethod(ObjectName); 
+0

Sorry, ich einen Beispielcode geschrieben, die zu einfach war. Ich habe Korrekturen vorgenommen. – tim4dev

Verwandte Themen