Comment by kccqzy
6 years ago
I did something very similar, extracting the iMessage database. It works by you making an iTunes backup of your phone, and then accessing a specific file in the backup. I ended up with a query that looks like this (only tested with iOS 8, as I sadly lost interest afterwards):
WITH groupchat_membership AS (
SELECT cache_roomnames,
group_concat(id, ', ') AS members
FROM (
SELECT DISTINCT message.cache_roomnames, handle.id
FROM message
JOIN handle ON message.handle_id=handle.ROWID
WHERE message.cache_roomnames IS NOT NULL AND message.is_from_me=0
)
GROUP BY cache_roomnames
),
unsorted_messages AS (
SELECT message.ROWID AS rowid,
CASE WHEN message.cache_roomnames IS NOT NULL THEN groupchat_membership.members ELSE handle.id END AS recipient,
CASE WHEN message.is_from_me THEN 'Me' ELSE handle.id END AS sender,
message.date,
strftime('%d/%m/%Y %H:%M:%S', datetime(message.date + 978307200, 'unixepoch', 'localtime')) AS human_date,
CASE WHEN message.cache_has_attachments THEN '<Attachment>' || message.text ELSE message.text END AS text
FROM message
LEFT JOIN handle ON message.handle_id=handle.ROWID
NATURAL LEFT JOIN groupchat_membership
)
SELECT unsorted_messages.recipient, sender, human_date, text
FROM unsorted_messages
NATURAL LEFT JOIN (
SELECT recipient, max(date) AS latest_date FROM unsorted_messages GROUP BY recipient
)
ORDER BY latest_date DESC, date ASC;
No comments yet
Contribute on Hacker News ↗