errore del contatore sms (indica "-1" quando non ci sono messaggi)

Ciao a tutti!!
ho un fastidioso problema sul mio iPhone!!
In precedenza mi ero già imbattuto nel bug dell’sms fantasma e avevo trovato il modo per risolverlo, ma ora il mio iphone non ha il solito problema, cioè il contatore dei messaggi non segna “1 nuovo messaggio” ma “-1 messaggio”!!!
com’è possibile che il contatore sia andato sotto zero???
Qualcuno è in grado di aiutarmi a correggere questo errore per favore?
Grazie 1000 in anticipo!!!

a me succede quando ricevo un messaggio dal gestore di reti… sparira’ in qualche ora…

…il fatto è che è ormai così da 2 settimane…

Allora forse hai un sms non letto?? :))) …scherzo!!!.. :slight_smile:

in precedenza mi ero gia imbattuto nel bug che segnala “1 messaggio” anche quando non ce ne sono, e l’ho risolto utilizzando iRealSMS e andando a cancellare l messaggi dell’operatore che col programma originale del telefono non vengono visualizzati e quindi creano il bug.
ora però il problema è diverso: il contatore è sceso sotto lo zero e quindi non c’è nessun messaggio da poter cancellare…
Bisognerebbe poter azzerare il contatore manualmente…qualcuno mi sa aiutare?

ma hai provato a spegnere e riaccendere l’iphone, giusto per fare una prova…

si, ho provato!! ho provato anche a ripristinarlo, a togliere e rimettere il file sms.db nella cartella degli SMS…nulla da fare, il problema persiste!
girando in rete ho trovato una guida che spiega come azzerare il contatore nel caso indichi 1 messaggio (il classico bug dell’sms fantasma capitato a molti)…ma nulla spiega come risolvere il mio problema!!
Probabilmente la procedura sarà la stessa ma io non l’ho capita bene (veniva indicato come procedere da terminale per modificare il database degli sms e azzerare il contatore)

aggiungo qua quella guida:

Dato che ho visto che sembra un problema che capita ogni tanto a causa di quei maledetti SMS di Vodafone e TIM, penso che questa guida vi possa essere di aiuto, ovviamente non è una cosa da due minuti, cmq cerco di descriverlo nel + breve tempo possibile:

prima di tutto posizionatevi (via SSH) nella cartella “/var/mobile/Library/SMS”, li dentro trovere un file chiamato sms.db, fatevene una copia di backup con il comando “cp sms.db sms.db.orig”

ora apriamo il file “sms.db” con il comando “sqlite3 sms.db”

vi apparirà un prompt simile a questo:

SQLite version 3.4.0
Enter “.help” for instructions
sqlite>

ora dobbiamo vedere qual’è il messaggio incriminato da flaggare come “letto”, per farlo eseguiamo il seguente comando:

sqlite> select * from message where flags=0;
148|+39347xxxxxx|1222456069|Ho chiamato alle 21:07 del 26/09/08. Informazione gratuita del servizio CHIAMAMI di Vodafone.|0|1||1|0|93|0|0

(il primo numero in grassetto è il ROWID che ci servirà dopo, secondo e terzo sono i campi da modificare)

nel mio caso è il famigerato sms di Vodafone quando arriva una chiamata ed il destinatario è irragiungibile…

ora per risolvere il problema del fatidico badge bisogna prima eliminare dei trigger che si occupano di inserire nel file sms.db i nuovi messaggi e marcarli come letti/non letti, inoltre se non eliminiamo questi trigger non potremo nemmeno fare l’aggiornamento del campo “flags”…

per farlo bisogna eseguire questi 6 comandi (potete fare copia&incolla):

drop trigger delete_message;
drop trigger delete_newest_message;
drop trigger insert_newest_message;
drop trigger insert_unread_message;
drop trigger mark_message_read;
drop trigger mark_message_unread;

sqlite> drop trigger delete_message;
sqlite> drop trigger delete_newest_message;
sqlite> drop trigger insert_newest_message;
sqlite> drop trigger insert_unread_message;
sqlite> drop trigger mark_message_read;
sqlite> drop trigger mark_message_unread;

fatto ciò, ora è possibile modificare i campi flags e replace…

per aggiornare i due campi ci basta eseguire questi due comandi:

sqlite> update message set flags=2 where ROWID=148;
sqlite> update message set replace=0 where ROWID=148;

abbiamo quasi finito, ora non ci resta che azzerare il contatore in un’altra tabella chiamata “msg_group”, eseguiamo una select per vedere quale riga ha il contatore ad 1 con il seguente comando:

sqlite> select * from msg_group;
ROWID type newest_message unread_count


1 0 1341 1
12 0 1337 0
17 0 1296 0

nel mio caso, c’è solo un messaggio che ha il campo “unread_count” ad 1… (che comanda il famoso bagde!)

lo portiamo a zero con questo comando:

sqlite> update msg_group set unread_count=0 where ROWID=1;

fatto questo, abbiamo praticamente finito, dobbiamo solo ricreare i trigger che abbiamo cancellato all’inizio… per farlo vi basterà incollare questi comandi:

CREATE TRIGGER delete_message AFTER DELETE ON message WHEN NOT read(old.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = old.group_id) - 1 WHERE ROWID = old.group_id; END;
CREATE TRIGGER delete_newest_message AFTER DELETE ON message WHEN old.ROWID = (SELECT newest_message FROM msg_group WHERE ROWID = old.group_id) BEGIN UPDATE msg_group SET newest_message = (SELECT ROWID FROM message WHERE group_id = old.group_id AND ROWID = (SELECT max(ROWID) FROM message WHERE group_id = old.group_id)) WHERE ROWID = old.group_id; END;
CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID >= IFNULL((SELECT MAX(ROWID) FROM message WHERE message.group_id = new.group_id), 0) BEGIN UPDATE msg_group SET newest_message = new.ROWID WHERE ROWID = new.group_id; END;
CREATE TRIGGER insert_unread_message AFTER INSERT ON message WHEN NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END;
CREATE TRIGGER mark_message_read AFTER UPDATE ON message WHEN NOT read(old.flags) AND read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) - 1 WHERE ROWID = new.group_id; END;
CREATE TRIGGER mark_message_unread AFTER UPDATE ON message WHEN read(old.flags) AND NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END;

vi consiglio di incollare riga per riga…
per controllare che siano stati creati correttamente, dal prompt di sqlite3 vi basta dare il comando “.schema”:

sqlite> .schema
CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key));
CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT);
CREATE TABLE message (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT, date INTEGER, text TEXT, flags INTEGER, replace INTEGER, svc_center TEXT, group_id INTEGER, association_id INTEGER, height INTEGER, UIFlags INTEGER, version INTEGER);
CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER);
CREATE INDEX message_flags_index ON message(flags);
CREATE INDEX message_group_index ON message(group_id, ROWID);
CREATE TRIGGER delete_message AFTER DELETE ON message WHEN NOT read(old.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = old.group_id) - 1 WHERE ROWID = old.group_id; END;
CREATE TRIGGER delete_newest_message AFTER DELETE ON message WHEN old.ROWID = (SELECT newest_message FROM msg_group WHERE ROWID = old.group_id) BEGIN UPDATE msg_group SET newest_message = (SELECT ROWID FROM message WHERE group_id = old.group_id AND ROWID = (SELECT max(ROWID) FROM message WHERE group_id = old.group_id)) WHERE ROWID = old.group_id; END;
CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID >= IFNULL((SELECT MAX(ROWID) FROM message WHERE message.group_id = new.group_id), 0) BEGIN UPDATE msg_group SET newest_message = new.ROWID WHERE ROWID = new.group_id; END;
CREATE TRIGGER insert_unread_message AFTER INSERT ON message WHEN NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END;
CREATE TRIGGER mark_message_read AFTER UPDATE ON message WHEN NOT read(old.flags) AND read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) - 1 WHERE ROWID = new.group_id; END;
CREATE TRIGGER mark_message_unread AFTER UPDATE ON message WHEN read(old.flags) AND NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END;
sqlite>

se avrete tutti e 6 i trigger siete apposto, basta fare il comando “.exit” ed avete finito…

sqlite> .exit

fate un bel respring ed il vostro badge scomparirà :slight_smile:

P.s.: vi consiglio di eseguire questa operazione senza la SIM, per evitare di ricevere un’SMS che vi sputtana qualcosa (sopratutto dopo aver tolto i trigger)
P.p.s.: ovviamente non mi assumo nessuna responsabilità, e fatevi un backup di quel file, così se fate casini potete ripristinare!

spero di essere stato utile,

ciao!

io mi fermo gia qui:

<<ora apriamo il file “sms.db” con il comando "sqlite3 sms.db>>

…mi si blocca dando un errore! io ho utilizzato Winscp e ho aperto il terminale e poi ho eseguito la procedura…qualcuno mi sa dire dove sbaglio?

ahhh…la guida l’ho presa da qui: [GUIDA]Risolvere badge SMS non letto [Archivio] - Spaziocellulare.com - Forum

Anch io stesso problema :frowning:
io ho installato Unread Sms Fixer ma non mi ha risolto nulla…ho il fm 2.2.1
Il fatto è che a me non sono i mex che mi arrivano dal mio operatore… ma mi è arrivato un sms dal cel di mia mamma e in anteprima ho letto che era lei “ti ho chiamato alle…” ma poi vado a vedere e nella conversazione non v è traccia :confused1:
Quasi quasi provo a mettere il 2.0.0 chissà…

cmq ci sono ben due altri metodi ENORMEMENTE più semplici per eliminare l’avviso:uno è unread sms fix su cydia(solo per gli sms), e sempre cu cydia nella repo di iphoneitalia nn ricordo se sia una app o cosa altro,che anche esso lo elimina(e serve anche per le altre app tipo installer,mail ecc…).Se la cerchi nel blog la trovi sicuro…