Ändern der nativen Forcedroid-Anwendung
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Ändern der nativen Android-Vorlagenanwendung, um die Listenanzeige anzupassen
- Verarbeiten einer REST-Antwort
- Löschen eines Salesforce-Datensatzes mittels REST-Anforderung
Anpassen der Listenanzeige
Wie bereits früher gezeigt, zeigt die native Android-Vorlagenanwendung eine Liste von Kontakten oder Accounts aus der Salesforce-Organisation des Benutzers an. Dabei handelt es sich derzeit um eine schreibgeschützte Liste, die über eine einfache SOQL SELECT-Abfrage erstellt wird, die durch die REST-Klassen des Mobile SDK verarbeitet wird.
Durch geeignete Bearbeitung soll die Anwendung um eine Löschaktion für lange Fingerdrücke erweitert werden. Wenn der Benutzer längere Zeit mit dem Finger auf einen Kontaktnamen in der Listenansicht tippt, versucht die neue Löschaktion, den zugehörigen Salesforce-Datensatz zu löschen. Wenn dieser Versuch erfolgreich ist, wird die Zeile dauerhaft aus der Kontaktlistenansicht in der Anwendung entfernt. Wenn die Anforderung fehlschlägt, wird der Benutzer über die entsprechende Ursache informiert und die Zeile der Listenansicht wird wieder eingefügt.
Informationen zum LongClick-Listener
Die Implementierung des LongClick-Listeners ist unkompliziert. Die Entscheidung, wie die LongClick-Listener-Klasse erstellt wird, ist jedoch etwas kniffliger. Wenn Sie die verschiedenen Codierungsoptionen untersuchen, stellen Sie zuerst fest, dass auf der Ebene der Listenansicht keine Klicks empfangen werden, sondern auf der Ebene der Listenelemente.
Glücklicherweise ist die Listener-Implementierung für Listenelemente dank der OnItemLongClickListener-Schnittstelle von Android keine beschwerliche Aufgabe. Diese Schnittstelle definiert einen einzelnen Listener, der mit der Listenansicht verknüpft ist und auf lange Fingerdrücke auf Elemente in der Liste reagiert. Sie erstellen eine Instanz dieser Klasse, indem Sie in Ihrer Ansichtsklasse eine öffentliche Schnittstelle implementieren.
Die nächste Herausforderung besteht darin, festzustellen, welche Ansichtsklasse den LongClick-Listener implementiert. Mit ListView-Objekten stellen Sie ein Datenobjekt bereit, das die in der Liste angezeigten Informationen zur Verfügung stellt. Die Vorlagenanwendung des Mobile SDK erstellt zu diesem Zweck ein ArrayAdapter<Zeichenfolge>-Objekt, das anschließend mit dem ListView-Objekt verknüpft.
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, ArrayList()) findViewById<ListView>(R.id.contacts_list).adapter = listAdapter
ArrayAdapter ist aber doch ein Datenobjekt und keine Ansicht. Richtig? Ja und darüber hinaus noch mehr. Der ArrayAdapter der Listenansicht für Kontakte erstellt für jedes Element im Datenset der Liste ein AdapterView-Objekt. Verwenden Sie die AdapterView-Klasse zum Implementieren von OnItemLongClickListener, da diese Adapteransichten die Objekte darstellen, die Sie interessieren.
Anschließend verknüpfen Sie das Listener-Objekt mit dem ListView-Objekt, das alle Benachrichtigungen für die jeweiligen untergeordneten Objekte empfängt. Diese Verknüpfung beschränkt die Interaktion von OnItemLongClickListener auf die Elemente in der Listenansicht der Vorlagenanwendung. Schließlich implementieren Sie das Löschverhalten in dieser einzigen Schnittstellenmethode.
Ein letztes Detail, das es zu lösen gilt: Wo fügen Sie diesen LongClick-Listener-Code ein? Mobile SDK bietet Ihnen die folgenden Rückmeldungsmethoden für Einstiegspunkte:
public abstract void onResume(RestClient client); @Override protected void onCreate(Bundle savedInstanceState); @Override public void onResume();
Davon kann eine entfernt werden: onCreate(Bundle savedInstanceState). Diese Methode konfiguriert die Aktivität und verarbeitet die Authentifizierungs-Flows, bevor die Ansichten instanziiert werden. Die Ansichten kommen erst in der onResume()-Methode zum Vorschein. Diese Methode scheint somit der wahrscheinlichste Kandidat zu sein. Die onResume(RestClient client)-Methode wird bei der Anmeldung von der Superklasse aufgerufen, um das authentifizierte RestClient-Objekt zu erfassen – dieses lassen wir allein stehen. So haben wir nun die Ergebnisse zusammen – fügen Sie Ihren LongClick-Listener-Code zu onResume() hinzu.
Implementieren eines einfachen LongClick-Listeners
Lassen Sie uns mit der Codierung beginnen. Öffnen Sie in Android Studio Ihre MainActivity-Klasse und schauen Sie sich die onResume()-Methode an.
- Öffnen Sie in Android Studio Ihre Datei MainActivity.kt.
- Suchen Sie die Methode onResume().
override fun onResume() {
// Hide everything until we are logged in
findViewById<ViewGroup>(root).visibility = View.INVISIBLE
// Create list adapter
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, ArrayList())
findViewById<ListView>(R.id.contacts_list).adapter = listAdapter
// ADD CODE HERE!
super.onResume()
}Beginnen Sie die Codierung wie hier gekennzeichnet – nachdem listAdapter für ListView festgelegt wurde, aber vor dem super.onResume()-Aufruf.
- Deklarieren Sie zur Vereinfachung eine ListView-Variable, die auf die Contacts-Listenansicht verweist, und ordnen Sie diese zu. Verwenden Sie die Activity.findViewById()-Methode, um in der Listenansichtsressource zu suchen.
findViewById<ListView>(R.id.contacts_list).adapter = listAdapter
val listView = findViewById<ListView>(R.id.contacts_list) super.onResume()
- Rufen Sie mit der listView-Variablen die AdapterView.setOnItemLongClickListener() lambda-Methode auf, um einen Listener für LongClick-Ereignisse einzurichten. Für den Listener-Parameter müssen Sie eine Inline-Vorlage der AdapterView.OnItemLongClickListener-Oberfläche instanziieren.
val listView = findViewById<ListView>(R.id.contacts_list)
listView.setOnItemLongClickListener { parent, view, position, id -> false }- (Optional) Wenn Sie eine Fehlermeldung über einen fehlenden Import erhalten, fügen Sie import android.widget.AdapterView zu Ihren Klassenimporten hinzu.
- Innerhalb des AdapterView.OnItemLongClickListener-Hauptteils müssen Sie die vorgefertigte return-Anweisung durch Code ersetzen, der eine Bestätigungsmeldung einblendet.
val listView = findViewById<ListView>(R.id.contacts_list)
listView.setOnItemLongClickListener { parent, view, position, id ->
Toast.makeText(
applicationContext,
"Long press received",
Toast.LENGTH_SHORT,
).show()
true
}- Stellen Sie die Anwendung zusammen, und führen Sie sie aus.
- Wenn Sie bei der Anwendung angemeldet sind, klicken Sie auf Fetch Contacts.
- Tippen Sie mehrere Sekunden lang auf einen Eintrag in der Liste der Kontakte. Wenn Alles in Ordnung ist, wird die Popupmeldung angezeigt.
Hinzufügen von Mobile SDK REST-Anforderungen
Sie sind schon fast startbereit, um Mobile SDK-Elemente hinzuzufügen. Um den Salesforce-Datensatz für die angetippte Zeile zu löschen, erstellen Sie in der onItemLongClick()-Methode eine REST-Anforderung. Diese Anforderung senden Sie dann an Salesforce. Bevor wir uns näher mit dem Code befassen, schauen Sie sich diese wichtigen Punkte in Ruhe an.
Abrufen einer RestClient-Instanz
Denken Sie daran: RestClient-Objekte werden niemals direkt erstellt. Das Mobile SDK erstellt eines für Sie und gibt es mithilfe der onResume(RestClient client)-Methode an MainActivity zurück. Diese RestClient-Instanz wird mit dem Zugriffs-Token des aktuellen Benutzers authentifiziert. Zu Ihren Zwecken weist die onResume(RestClient client)-Methode diese Instanz der client-Klassenvariablen zu.
Erstellen einer REST-Anforderung
Zum Erstellen der REST-Anforderung für diese Übung rufen Sie die RestRequest-Factory-Methode auf, um einen Datensatz zu löschen:
public static RestRequest getRequestForDelete(String apiVersion, String objectType, String objectId);
Woher kriegen Sie die Argumentwerte? Sehen Sie sich diese Tabelle an.
Parameter | Value (Wert) |
|---|---|
apiVersion | ApiVersionStrings.getVersionNumber(Context context) |
objectType |
|
objectId | ? ? |
Der objectId-Parameter ist ein bisschen knifflig: Er benötigt einen Salesforce-Wert, den Ihre forcedroid-Anwendung im Rohzustand nicht erkennt. Warum haben Sie diesen Wert nicht und wie können Sie ihn ermitteln? Die Antworten sind einfach:
- Sie haben die IDs nicht, weil diese in den ursprünglichen REST-Anforderungen (den Anforderungen, die die Liste füllen) nicht angefordert wurden.
- Sie können die ID abrufen, indem Sie die REST-Anforderungen ändern.
Optimieren der SOQL-Anforderung der Vorlagenanwendung
Ihre MainActivity-Klasse gibt zwei REST-Abfragen aus: eine für Kontakte, die andere für Accounts. Jede Abfrage enthält eine SOQL-Anweisung. Sie verwenden hier keine Accounts, sondern aktualisieren die Kontaktdatensatzabfrage, um ID-Werte zurückzugeben.
- Öffnen Sie in Android Studio die Datei MainActivity.kt.
- Suchen Sie die Methode onFetchContactsClick().
fun onFetchContactsClick(v: View) {
sendRequest("SELECT Name FROM Contact")
}- Ändern Sie die SOQL-Abfrage, indem Sie die Felder Name und Id auswählen. Achten Sie auf die Camel-Case-Schreibweise des ID-Feldnamens. Bei Feldnamen wird die Groß-/Kleinschreibung berücksichtigt.
fun onFetchContactsClick(v: View) {
sendRequest("SELECT Name, Id FROM Contact")
}Da Sie nun gewappnet sind, um die ID-Werte in der REST-Antwort zu erhalten: Wo kann man diese am besten ablegen? Die Vorlagenanwendung kopiert den Name-Wert der einzelnen Datensätze lediglich in eine Listenansichtszeile - die betreffenden Werte werden nicht zwischengespeichert. Um Suchkomponenten in Ihrem LongClick-Handler zu aktivieren, müssen Sie die IDs im Klassenbereich speichern.
Anpassen der sendRequest()-Methode der Vorlagenanwendung
Blättern Sie nach unten zur sendRequest(String soql)-Methode. Bei dieser Methode kommt die Abrufanforderung an. Diese Methode veranschaulicht sehr gut, wie der REST-Mechanismus des Mobile SDK funktioniert. Sehen wir uns das kurz an. Die Methode ruft zuerst eine RestRequest-Factory-Methode auf, die eine REST-Anforderung für eine gegebene SOQL-Abfrage definiert:
val restRequest = RestRequest.getRequestForQuery(ApiVersionStrings.getVersionNumber(this), soql)
Anschließend wird das neue RestRequest-Objekt im client.sendAsync()-Aufruf an Salesforce gesendet.
client!!.sendAsync(restRequest, object : AsyncRequestCallback {
override fun onSuccess(request: RestRequest, result: RestResponse) {
result.consumeQuietly() // consume before going back to main thread
runOnUiThread {
try {
listAdapter!!.clear()
val records = result.asJSONObject().getJSONArray("records")
for (i in 0..<records.length()) {
listAdapter!!.add(records.getJSONObject(i).getString("Name"))
}
} catch (e: Exception) {
onError(e)
}
}
}
override fun onError(exception: Exception) {
runOnUiThread {
Toast.makeText(this@MainActivity,
this@MainActivity.getString(R.string.sf__generic_error),
Toast.LENGTH_LONG).show()
}
}
})Zusätzlich zum RestRequest-Objekt benötigt der sendAsync()-Aufruf eine Implementierung der Mobile SDK AsyncRequestCallback-Schnittstelle. Die onSuccess()-Methode dieser Oberfläche empfängt die REST-Antwort asynchron über eine Rückmeldung. Ihre standardmäßige AsyncRequestCallback-Implementierung verarbeitet nur die SOQL-Abfrage, die in Ihrer forcedroid-Anwendung definiert werden.
Diese onSuccess()-Methode erledigt bereits das Gewünschte. Sie enthält Code, der die von der REST-Antwort zurückgegebenen Datensätze extrahiert und diese der lokalen records-Variable zuweist. Lassen Sie uns diese Variable zu dem Klassenbereich verschieben, indem wir sie außerhalb des Methodenhauptteils neu deklarieren.
- Deklarieren Sie neben dem oberen Abschnitt mit der Definition der MainActivity-Klasse JSONArray records mit den vorhandenen Klassenvariablendeklarationen als private Variable:
class MainActivity : SalesforceActivity() {
private var client: RestClient? = null
private var listAdapter: ArrayAdapter<String>? = null
private lateinit var records: JSONArray
…- Entfernen Sie in der Methode onSuccess() die Typdeklaration für die records-Variable:
override fun onSuccess(request: RestRequest, result: RestResponse) {
result.consumeQuietly() // consume before going back to main thread
runOnUiThread {
try {
listAdapter!!.clear()
records = result.asJSONObject().getJSONArray("records")
for (i in 0..<records.length()) {
listAdapter!!.add(records.getJSONObject(i).getString("Name"))
}
} catch (e: Exception) {
onError(e)
}
}
}Fertigstellen der onItemLongClick()-Methode
Sie können jetzt die onItemLongClick()-Methode fertigstellen. Der Basisalgorithmus lautet wie folgt:
- Abrufen eines "Löschanforderungs"-Objekts durch Aufrufen einer entsprechenden Mobile SDK RestRequest-Factory-Methode. Alle RestRequest-Methoden lösen Ausnahmen aus. Sie müssen den Aufruf daher in einen try...catch-Block einschließen.
- Senden des "Löschanforderungs"-Objekts an Salesforce unter Verwendung des generierten RestClient-Objekts.
- Verarbeiten Sie das REST-Ergebnis in Rückmeldungsmethoden.
Anfordern eines RestRequest-Objekts
- Blättern Sie zurück zur setOnItemLongClickListener-Methode in der onResume()-Methode.
- Deklarieren Sie nach dem Toast.makeText()-Aufruf ein lokales RestRequest-Objekt namens restRequest.
var restRequest: RestRequest
- Fügen Sie ein leeres try...catch-Konstrukt hinzu.
try {
} catch (e: Exception) {
}- Rufen Sie im try-Block eine Factory-Methode auf, die ein REST-Anforderungsobjekt für einen Löschvorgang anfordert. TIPP: Verwenden Sie die statische RestRequest.getRequestForDelete()-Methode.
try {
restRequest = RestRequest.getRequestForDelete(
// arguments?
)
} catch (e: Exception) {
}- Rufen Sie für den ersten Parameter die in den Mobile SDK-Ressourcen Ihres Projekts angegebene Salesforce-API-Version ab.
try {
restRequest = RestRequest.getRequestForDelete(
/* apiVersion = */ ApiVersionStrings.getVersionNumber(this),
// ..
)
} catch (e: Exception) {
}- Geben Sie für den objectType-Parameter
"Contact"an.
try {
restRequest = RestRequest.getRequestForDelete(
/* apiVersion = */ ApiVersionStrings.getVersionNumber(this),
/* objectType = */ "Contact",
// ..
)
} catch (e: Exception) {
}- Übergeben Sie an RestRequest.getRequestForDelete() die ID des Eintrags im Datensatz-Array, der der aktuellen Position in der Listenansicht entspricht. So rufen Sie die ID ab:
try {
restRequest = RestRequest.getRequestForDelete(
/* apiVersion = */ ApiVersionStrings.getVersionNumber(this),
/* objectType = */ "Contact",
/* objectId = */ records.getJSONObject(position).getString("Id"),
)
} catch (e: Exception) {
}- Rufen Sie im catch-Block printStackTrace() für das Exception-Argument auf.
try {
restRequest = RestRequest.getRequestForDelete(
/* apiVersion = */ ApiVersionStrings.getVersionNumber(this),
/* objectType = */ "Contact",
/* objectId = */ records.getJSONObject(position).getString("Id"),
)
// Send the request
// ...
} catch (e: Exception) {
e.printStackTrace()
}Senden Sie das erhaltene "Löschanforderungs"-Objekt an Salesforce und verarbeiten Sie das Ergebnis in Rückmeldungsmethoden.
Hinzufügen der RestClient.sendAsync()-Methode
Sie sind fast fertig! Das letzte Puzzleteil besteht darin, die Anforderung mit der RestClient.sendAsync()-Methode zu senden. Für diese Methode müssen Sie die AsyncRequestCallback-Schnittstelle implementieren. Wie Sie wissen, sendet das Mobile SDK REST-Antworten an Ihre AsyncRequestCallback-Methoden.
- In onItemLongClick() nach dem Aufruf getRequestForDelete() kopieren Sie den Code RestClient.sendAsync() aus der sendRequest()-Methode und fügen Ihn ein.
- Entfernen Sie den internen Code der try-Verzweigung der onSuccess()-Methode. Entfernen Sie nicht die catch-Verzweigung, da lediglich ein Fehlerhandler aufgerufen wird.
- Behalten Sie die onError()-Override-Implementierung, da sie so allgemeingültig ist, dass sie für jede Salesforce-Antwort funktioniert.
Hier ist der Aufruf an RestClient.sendAsync() in Stub-Form.
restRequest = RestRequest.getRequestForDelete(
/* apiVersion = */ ApiVersionStrings.getVersionNumber(this),
/* objectType = */ "Contact",
/* objectId = */ records.getJSONObject(position).getString("Id"),
)
client!!.sendAsync(restRequest, object : AsyncRequestCallback {
override fun onSuccess(request: RestRequest?, result: RestResponse) {
result.consumeQuietly()
runOnUiThread {
// The network component doesn’t report app layer status.
// Use Mobile SDK RestResponse.isSuccess() method to check
// whether the REST request itself succeeded.
if (result.isSuccess) {
try {
} catch (e: Exception) {
onError(e)
}
}
}
}
override fun onError(exception: Exception) {
runOnUiThread {
Toast.makeText(this@MainActivity,
getString(R.string.sf__generic_error),
Toast.LENGTH_LONG,
).show()
}
}
})Implementieren der onSuccess()-Rückmeldungsmethode
Gehen Sie in der onSuccess()-Methode von AsyncRequestCallback() wie folgt vor:
- Vergewissern Sie sich, dass der Löschvorgang erfolgreich war, indem Sie den HTTP-Status testen. Diese Prüfung ist erforderlich, weil die zugrunde liegende Netzwerkkomponente nur Transport Layer-Fehler berichtet und keine REST-Anforderungsfehler.
- Wenn der Vorgang erfolgreich war, entfernen Sie das Element an der gegebenen Position aus der Listenansicht.
- Posten Sie eine Erfolgsmeldung.
Zum Entfernen der Zeile verwenden Sie die listAdapter-Klassenvariable. Sie können ArrayAdapter.remove(T object) mit dem Positionswert, der an die onItemLongClick()-Methode übergeben wurde, aufrufen, um das Objekt anzufordern. Beispiel:
listAdapter?.run {
remove(getItem(position))
}- Nachdem Sie ein Listenelement entfernt haben, rufen Sie sendRequest(request) auf, um die neu geordnete Liste zu aktualisieren und sie mit Ihrem lokalen records-Array synchron zu halten:
if (result.isSuccess) {
try {
listAdapter?.run {
remove(getItem(position))
}
sendRequest("SELECT Name, Id FROM Contact")
} catch (e: Exception) {
onError(e)
}
}- Erstellen Sie dann ein Warnfeld, in dem eine Erfolgsmeldung angezeigt wird. Zeigen Sie andernfalls die Fehlermeldung an.
if (result.isSuccess) {
try {
listAdapter?.run {
remove(getItem(position))
}
sendRequest("SELECT Name, Id FROM Contact")
AlertDialog.Builder(this@MainActivity)
.setMessage("Record successfully deleted!")
.setCancelable(true)
.create()
.show()
} catch (e: Exception) {
onError(e)
}
} else {
Toast.makeText(this@MainActivity,
getString(R.string.sf__generic_error),
Toast.LENGTH_LONG,
).show()
}Die vollständige setOnItemLongClickListener()-Funktion sieht so aus.
override fun onResume() {
// Hide everything until we are logged in
findViewById<ViewGroup>(root).visibility = View.INVISIBLE
// Create list adapter
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, ArrayList())
findViewById<ListView>(R.id.contacts_list).adapter = listAdapter
val listView = findViewById<ListView>(R.id.contacts_list)
listView.setOnItemLongClickListener { parent, view, position, id ->
Toast.makeText(
applicationContext,
"Long press received",
Toast.LENGTH_SHORT,
).show()
var restRequest: RestRequest
try {
restRequest = RestRequest.getRequestForDelete(
/* apiVersion = */ ApiVersionStrings.getVersionNumber(this),
/* objectType = */ "Contact",
/* objectId = */ records.getJSONObject(position).getString("Id"),
)
client!!.sendAsync(restRequest, object : AsyncRequestCallback {
override fun onSuccess(request: RestRequest?, result: RestResponse) {
result.consumeQuietly()
runOnUiThread {
// The network component doesn’t report app layer status.
// Use Mobile SDK RestResponse.isSuccess() method to check
// whether the REST request itself succeeded.
if (result.isSuccess) {
try {
listAdapter?.run {
remove(getItem(position))
}
sendRequest("SELECT Name, Id FROM Contact")
AlertDialog.Builder(this@MainActivity)
.setMessage("Record successfully deleted!")
.create()
.show()
} catch (e: Exception) {
onError(e)
}
} else {
Toast.makeText(this@MainActivity,
getString(R.string.sf__generic_error),
Toast.LENGTH_LONG,
).show()
}
}
}
override fun onError(exception: java.lang.Exception) {
runOnUiThread {
Toast.makeText(
this@MainActivity,
this@MainActivity.getString(R.string.sf__generic_error),
Toast.LENGTH_LONG
).show()
}
}
})
} catch (e: Exception) {
e.printStackTrace()
}
true
}
super.onResume()
}Letzte Bereinigung ... und Action!
Eine abschließende Bereinigungsaufgabe besteht darin, die Schaltfläche Fetch Accounts zu entfernen. Da die Listenansicht von Fetch Contacts und Fetch Accounts gemeinsam genutzt wird, gilt der LongClick-Handler gleichermaßen für beide. Dieser Handler ist jedoch für Accounts nutzlos, weil die verwendete ID zum Löschen des Datensatzes nur für einen Kontakt gilt. Alternativ (als "Zusatzbonus") können Sie das Gelernte anwenden und den LongClick-Handler so anpassen, dass Kontakte und Accounts gelöscht werden. In diesem Lernprogramm entfernen wir jedoch nur den accountbezogenen Code.
Löschen Sie die folgenden Elemente aus den angegebenen Dateien:
File-Block | Aktion |
|---|---|
MainActivity.kt | Löschen Sie die Funktion onFetchAccountsClick(v: View). |
res/layout/main.xml | Wählen Sie eine der folgenden Vorgehensweisen aus:
|
res/values/strings.xml | Wählen Sie eine der folgenden Vorgehensweisen aus:
|
So, nun ist Ihre Anwendung fertig und kann ausgeführt werden!
- Klicken Sie in Android Studio auf Run (Ausführen) | Run ‘app’ ('Anwendung' ausführen).
- Wählen Sie einen Mobile SDK-kompatiblen Emulator oder ein verbundenes Gerät.
- Wenn die Anwendung ausgeführt wird, melden Sie sich bei Ihrer Salesforce-Organisation an und klicken dann auf Fetch Contacts, um die Liste anzuzeigen. Tippen Sie solange auf ein Element in der Liste, bis eine Popupmeldung den langen Fingerdruck bestätigt.
Achten Sie darauf: Für jeden Standardkontakt in der Developer Edition-Datenbank, den Sie zu löschen versuchen, wird eine Fehlerantwort angezeigt. Diese Fehler treten auf, weil jeder Kontakt, der bereits in einer Developer Edition-Organisation vordefiniert ist, das übergeordnete Element anderer Datensätze ist. Zur Vorbereitung auf die Tests müssen Sie sich bei Ihrer Developer Edition-Organisation anmelden und einen oder mehrere Kontakte erstellen, die keine anderen Datensätze besitzen. Bei einem erfolgreichen Löschvorgang wird eine Meldung mit dem Hinweis angezeigt, dass der Datensatz gelöscht wurde.
Ressourcen
- Salesforce Developers Guide: Verwenden von REST-APIs (in englischer Sprache)
- Salesforce Developers: RestClient Class
- Salesforce Developers: RestRequest Class