Selbst ist der Mann 
Die Anrufhistorie wird in der call_history.db gespeichert, unter iOS 4 liegt sie in "/private/var/wireless/Library/CallHistory/".
Das ist eine normale SQLite Datenbank. SQLite unterstuetzt Trigger. Und einen solchen hab ich nun auf die call-Tabelle gelegt, sodass ich kontrollieren kann, ob ein Datensatz geloescht wird.
Mein Trigger hier sorgt dafuer, dass die Anrufe der letzten 30 Tage erhalten bleiben:
CREATE TRIGGER keep_call_history DELETE ON call
WHEN ( datetime(old.date, 'unixepoch', 'localtime') > datetime('now', 'localtime', '-30 days') )
SELECT RAISE(FAIL, 'not older than 30 days');
Dieser Ansatz hat den Vorteil, dass einfach nur das delete nicht ausgefuehrt wird. Das Telephony-Framework setzt fuer alle Datensatze, die ueber die standardmaessigen 100 hinausgehen, nach jedem Anruf ein delete ab. Was man sonst so an Loesungen findet, fuegt die geloeschten Datensaetze einfach wieder in die call-Tabelle ein. Dies fuehrt aber zu einer deutlich hoeheren Last, und man hat keine echte Kontrolle darueber, dass immer nur die neuesten Datensaetze erhalten bleiben.
Diese Modifikation bleibt auch nach einem Restore erhalten, solange man ein Backup einspielt.
Wenn man den Trigger wieder loswerden moechte, genuegt ein
drop trigger keep_call_history;
Schritt-fuer-Schritt Anleitung:
- Voraussetzung: Jailbreak, SSH-Zugang, APT 0.7 (ueber Cydia).
1. per SSH mit dem iPhone verbinden, dazu muss das iPhone per WLAN im gleichen Netz wie der Rechner sein.
2. sqlite3 installieren, falls nicht schon vorhanden: apt-get update; apt-get install sqlite3
3. Backup der Call History DB anfertigen: cp /private/var/wireless/Library/CallHistory/call_history.db /var/root/call_history.db.backup
4. Call History DB oeffnen: sqlite3 /private/var/wireless/Library/CallHistory/call_history.db
5. Am sqlite> prompt das Statement fuer den Trigger (siehe oben) per copy & paste einfuegen, Zeile fuer Zeile.
6. Mit STRG+D den sqlite3 Client beenden
7. Fertig!