首先,我从来没有真正做过任何繁重的编程,只是用Python搞砸了一下。如果我的任何问题听起来很奇怪,请尝试理解我。
我遇到以下问题:
我在iOS 4.0.1上运行的iPhone 3GS在拨打电话时出现问题。解决此问题的唯一方法是将iPhone恢复为出厂设置。对于iPhone用户来说很明显,这样做会丢失我的短信历史记录等内容。通过将* .db扩展名添加到包含整个SMS历史记录的数字命名文件,我能够从备份中检索sms.db文件。
我现在拥有2个这样的短信数据库:已检索的数据库和已在手机上显示新消息的数据库。我想做的是将这两个数据库中的数据合并为一个单个文件(出于我的目标,我的iPhone显然是越狱了)。
iPhone sms.db数据库包含各种表,其中一个表称为“消息”,包含电话号码,SMS消息文本,标志等信息。我能够通过使用SQL数据库浏览器2.0 b1将“消息”表从较新的数据库导出到较旧的数据库中,并将其称为“message2”。后来,在SQLite Manager for Firefox中执行
INSERT INTO
语句时出现了一些问题,我发现首先我必须通过执行以下语句来删除并重新创建导致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应用程序可能会崩溃(例如UNICODE)。我找到了1条短信,其中UNICODE字符渲染不正确并手动更正,但应用程序在更正后仍然崩溃。我只是不确定我发现的是渲染的唯一错误。有没有办法(在SQL或其他方面)只找到有这种错误的文本?
此外,SSH-ed sms.db操作有点奇怪,因为它不会显示列表中的所有消息。我可以通过使用搜索功能并键入消息的一部分来找到一些不显示的内容。然后iPhone找到它,只显示没有任何名称或电话号码的文本预览,但是当我点击它时无法显示它。它要么根本不响应,要么将我重定向到不同的对话历史记录。
如果有人对修改sms.db有更多了解,或者对可能导致SMS应用程序崩溃的其他因素有任何疑问,请随时发布您要说的内容:)
编辑:正如我所料,为更新的消息分配更高的数字并将它们放在te列表的底部工作,现在我最关心的对话都显示了:)此外,SMS应用程序没有崩溃:)然而,我仍然遇到的唯一问题是,当您查看时,有些消息不在列表中,但在搜索时键入的关键字与这些消息的内容匹配时会显示。就像以前一样,它们在显示时既没有数字,也没有从搜索视图中打开。由于这些消息对我来说并不重要,我将它们从sms.db“message”表中删除,然后将更改后的文件放回到iPhone上。虽然这些消息不再出现在sms.bd文件中,但它们仍然会在搜索时显示:/这不是一个大问题,因为其他一切都有效,但在搜索结果中将它们放在一边有点恼火。有谁知道如何解决这个问题?感谢您帮助我到目前为止,还要提前多谢一点:)
答案 0 :(得分:1)
当你说
时WHERE ROWID='1' AND '2' AND '3'
你实际上在说
WHERE (ROWID='1') AND ('2') AND ('3')
我怀疑'2'和'3'被解释为TRUE。此外,ROWID应该是整数。将它们与字符串进行比较是有效的,因为sqlite3会自动将整数转换为字符串。
你可能意味着像
WHERE ROWID IN (1,2,3)
答案 1 :(得分:-1)
使用移动终端并输入:
chown -R mobile:mobile /var/mobile/Library/SMS