Объедините 2 базы данных SMS (sms.db) с 1 iPhone 3GS, работающего на iOS 4.0.1, и поместите выходной файл обратно на iPhone без сбоя приложения SMS - PullRequest
0 голосов
/ 11 августа 2010

Прежде всего, я никогда не занимался тяжелым программированием, просто немного дурачился с Python.Если какой-либо из моих вопросов звучит странно или нет, попробуйте понять меня.

У меня есть следующая проблема:

Мой iPhone 3GS, работающий на iOS 4.0.1, имел проблемы с совершением исходящих звонков.Единственный способ решить эту проблему - восстановить заводские настройки iPhone.Как очевидно для владельцев iPhone, при этом я потерял такие вещи, как история своих SMS-сообщений.Мне удалось извлечь файл sms.db из резервной копии, добавив расширение * .db к файлу с числовым именем, содержащему всю историю SMS.

Теперь у меня есть 2 такие базы данных SMS: Найденнаяи тот, с новыми сообщениями уже на телефоне.Я хотел бы объединить данные из этих двух баз данных в один файл (для моей цели я, разумеется, взломан).

База данных iPhone sms.db содержит различные таблицы., одно из которых называется «сообщения» и содержит такую ​​информацию, как номера телефонов, текст сообщения SMS, флаги и так далее.Мне удалось экспортировать таблицу «сообщений» из более новой базы данных в более старую с помощью обозревателя баз данных SQL 2.0 b1 и назвать ее «message2».Позже, столкнувшись с некоторыми проблемами при выполнении оператора

INSERT INTO
в SQLite Manager для Firefox, я обнаружил, что сначала мне пришлось отбросить и воссоздать триггеры, вызывающие ошибку
No such function: "read"
, выполнив следующий оператор:
drop trigger insert_unread_message;
drop trigger mark_message_unread;
drop trigger mark_message_read;
drop trigger delete_message;
CREATE TRIGGER insert_unread_message AFTER INSERT ON message WHEN NOT new.flags = 2 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 old.flags = 2 AND NOT new.flags = 2 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 old.flags = 2 AND new.flags = 2 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 delete_message AFTER DELETE ON message WHEN NOT old.flags = 2 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;

После всего этого я смог наконец добавить новые SMS-сообщения в старую базу данных.Это, однако, не ознаменовало конец различных проблем.Прежде всего, новые сообщения, которые я добавил, были помещены в верхнюю часть таблицы (над старыми) с номерами в столбце «ROWID» ниже, чем у старых сообщений.Правильный (и логический) формат таблицы должен быть таким, чтобы эти более новые сообщения размещались в самом низу таблицы, и им назначались более высокие номера.Я не знаю, какой тип SQL-оператора должен быть возвращен, только столбец «ROWID» в следующем формате:

ROWID
1
2
3
и т. Д., Эти числа являются теми, которые назначены более новым сообщениям.Я пытался добиться этого, выполнив следующие действия:
SELECT * FROM message
WHERE ROWID='1' AND '2' AND '3'
и т. Д., Но SQLite Manager вернул только строку с «1», а не остальные.Какое утверждение можно использовать для достижения того, чего я хочу?

Кроме того, когда я отправляю SSH отредактированный файл sms.db, который у меня уже есть на iPhone, приложение SMS вылетает каждый раз, когда я пишу сообщение и нажимаюКнопка «ОК» для отправки (длина или любые знаки в сообщении не имеют значения).Я читал, что приложение SMS может зависать, когда оно отображает и отображает некоторые символы неправильно (например, UNICODE).Я нашел 1 SMS-сообщение, в котором символы UNICODE были отрисованы неправильно, и исправил его вручную, но приложение все еще падает после исправления.Я просто не уверен, что обнаруженная ошибка была единственной ошибкой при рендеринге.Есть ли способ (либо в SQL, либо в другом) найти только тексты с такими ошибками?

Кроме того, SSH-ed sms.db работает немного странно, так как он не отображает все сообщения всписок.Я могу найти некоторые из них, которые не отображаются, используя функцию поиска и введя часть сообщения.Затем iPhone находит его, отображая только предварительный просмотр текста без имени или номера телефона, но не может открыть его, когда я нажимаю на него.Он либо вообще не реагирует на прослушивание, либо перенаправляет меня в другую историю разговоров.

Если у кого-то есть больше знаний об изменении sms.db или есть какие-либо мысли о том, что еще может вызывать SMSприложение для сбоя, не стесняйтесь размещать то, что вы должны сказать:)

РЕДАКТИРОВАТЬ: Как и ожидалось, назначение более высоких номеров для новых сообщений и размещение их в нижней части списка работали, и теперь все разговоры, о которых я больше всего заботился, отображаются :) Кроме того, приложение SMS не сбой больше :) Однако единственная проблема, с которой я столкнулся, заключается в том, что есть некоторые сообщения, которых нет в списке во время просмотра, но они отображаются, когда ключевые слова, введенные при поиске, соответствуют содержанию этих сообщений. Как и раньше, они не имеют номеров во время отображения и не могут быть открыты из окна поиска. Поскольку эти сообщения, в частности, не были важны для меня, я удалил их из таблицы «сообщений» sms.db и вернул измененный файл обратно на iPhone. Хотя этих сообщений больше нет в файле sms.bd, они все равно отображаются во время поиска: / Это не такая большая проблема, потому что все остальное работает снова, но немного раздражает, когда они появляются в результатах поиска. Кто-нибудь знает, как я мог это исправить?

Спасибо за помощь, которую я получил до сих пор, а также спасибо за немного больше заранее:)

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Когда вы говорите

WHERE ROWID='1' AND '2' AND '3'

Вы на самом деле говорите

WHERE (ROWID='1') AND ('2') AND ('3')

Я подозреваю, что '2' и '3' интерпретируются как ИСТИНА. Также ROWID должны быть целыми числами. Сравнение их со строками работает, потому что sqlite3 автоматически преобразует целые числа в строки.

Вы, вероятно, имеете в виду что-то вроде

WHERE ROWID IN (1,2,3)
0 голосов
/ 04 июня 2011

Используйте мобильный терминал и наберите:

chown -R mobile:mobile /var/mobile/Library/SMS                               
...