<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.theiphonewiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Havarh</id>
	<title>The iPhone Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.theiphonewiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Havarh"/>
	<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/wiki/Special:Contributions/Havarh"/>
	<updated>2026-05-18T05:03:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Messages&amp;diff=41197</id>
		<title>Talk:Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Messages&amp;diff=41197"/>
		<updated>2014-05-23T20:33:19Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Removed &amp;quot;is&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incorrect name ==&lt;br /&gt;
&lt;br /&gt;
The correct name of this application is Messages. iMessage is just the protocol/name used for Apple's iCloud messaging-service. This can also be seen in the features section for iOS 5 as linked to in the references-section - iMessage was a new feature in iOS 5. I'm renaming this page Messages. -[[User:Havarh|havarh]] ([[User talk:Havarh|talk]]) 21:10, 28 July 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=34082</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=34082"/>
		<updated>2013-08-16T13:40:26Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* _SqliteDatabaseProperties */ version updates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''call_history.db''' is an SQLite 3 database file which contains the call history from MobilePhone.app on iOS.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
The [[iTunes Backup]] filename of &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database&lt;br /&gt;
*version 12 is used in iOS 7&lt;br /&gt;
*version 11 is used in iOS 6&lt;br /&gt;
*version 9 is used in iOS 5&lt;br /&gt;
*version 5 is used in iOS 3&lt;br /&gt;
*version 3 is used in iOS 2 and 1.1.4&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of contact that has been called/has received call from.&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | the date of the phone call&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, 8 for blocked calls&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Contacts or Address Book ID of the contact being called. This column would be '''-1''' if the contact is unknown (e.g. not in address book). This column is always '''-1''' on incoming calls.&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always empty&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
Note: name, country_code, network_code where added in iOS 5, while read, assisted, face_time_data, originalAddress where added in iOS 6.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://avi.alkalay.net/2011/12/iphone-call-history.html iPhone Call History Database]&lt;br /&gt;
* [http://code.google.com/p/iphonelogd/wiki/CallHistoryDatabase Call History Database]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=34081</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=34081"/>
		<updated>2013-08-16T13:21:46Z</updated>

		<summary type="html">&lt;p&gt;Havarh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''call_history.db''' is an SQLite 3 database file which contains the call history from MobilePhone.app on iOS.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
The [[iTunes Backup]] filename of &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database&lt;br /&gt;
*version 12 is used in iOS 7&lt;br /&gt;
*version 11 is used in iOS 6&lt;br /&gt;
*version 9 is used in iOS 5&lt;br /&gt;
*version 5 is used in iOS 3&lt;br /&gt;
*version 3 is used in iOS 2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of contact that has been called/has received call from.&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | the date of the phone call&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, 8 for blocked calls&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Contacts or Address Book ID of the contact being called. This column would be '''-1''' if the contact is unknown (e.g. not in address book). This column is always '''-1''' on incoming calls.&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always empty&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
Note: name, country_code, network_code where added in iOS 5, while read, assisted, face_time_data, originalAddress where added in iOS 6.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://avi.alkalay.net/2011/12/iphone-call-history.html iPhone Call History Database]&lt;br /&gt;
* [http://code.google.com/p/iphonelogd/wiki/CallHistoryDatabase Call History Database]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=34079</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=34079"/>
		<updated>2013-08-16T10:43:55Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* Serialization */ Added info about iTunes Backup filename, and more info about the various _ClientVersion versions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is an SQLite 3 database file which contains the call history from MobilePhone.app on iOS.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
The [[iTunes Backup]] filename of &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database&lt;br /&gt;
*version 12 is used in iOS 7&lt;br /&gt;
*version 11 is used in iOS 6&lt;br /&gt;
*version 9 is used in iOS 5&lt;br /&gt;
*version 5 is used in iOS 3&lt;br /&gt;
*version 3 is used in iOS 2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of contact that has been called/has received call from.&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | the date of the phone call&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, 8 for blocked calls&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Contacts or Address Book ID of the contact being called. This column would be '''-1''' if the contact is unknown (e.g. not in address book). This column is always '''-1''' on incoming calls.&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always empty&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
Note: name, country_code, network_code where added in iOS 5, while read, assisted, face_time_data, originalAddress where added in iOS 6.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://avi.alkalay.net/2011/12/iphone-call-history.html iPhone Call History Database]&lt;br /&gt;
* [http://code.google.com/p/iphonelogd/wiki/CallHistoryDatabase Call History Database]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=34078</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=34078"/>
		<updated>2013-08-16T10:18:59Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* Serialization */ Added info about iTunes Backup filename, and info about how to recreate the sms.db-shm and -wal files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:IMessage icon.png|thumb|Messages in iOS 5]]&lt;br /&gt;
[[Messages]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0, while support for sending and receiving iMessages was introduced in iOS 5. The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==iMessage==&lt;br /&gt;
With iOS 5 Apple introduced the iCloud based instant messaging service, iMessage, which works across different iOS devices and Mac OS X, and is the first native messaging service for iPod touch and iPad. Messages for Mac OS X was introduced with OS X Mountain Lion, and replaced the iChat instant messaging program.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). If the database is updated manually, it's important to recreate these files. On a jailbroken device, they could be recreated using the &amp;lt;code&amp;gt;sqlite3&amp;lt;/code&amp;gt; program, for example by issuing the following command: &amp;lt;code&amp;gt;sqlite3 sms.db .dump&amp;gt;/dev/null&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt; file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&amp;lt;br /&amp;gt;&lt;br /&gt;
The [[iTunes Backup]] filename of sms.db is &amp;lt;code&amp;gt;3d0d7e5fb2ce288813306e4d4636395e047a3d28&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of outgoing messages (since last counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of outgoing messages (since forever, isn't affected by an counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of incoming messages (since last counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of incoming messages (since forever, isn't affected by an counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | specifies if it's an iMessage or not, value 0 or 1 (0=SMS/MMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*&amp;lt;del&amp;gt;[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&amp;lt;/del&amp;gt; (broken) ([http://web.archive.org/web/20120630170444/http://www.apple.com/ios/features.html#imessage Archive.org's archive of page])&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Databases&amp;diff=33275</id>
		<title>Talk:Databases</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Databases&amp;diff=33275"/>
		<updated>2013-07-31T10:47:33Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* New versions. */ Messages not iMessage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== New versions. ==&lt;br /&gt;
&lt;br /&gt;
How do you find new versions for each major iOS? I want to check for [[iOS]] 6. --[[User:Adaminsull|adaminsull]] ([[User talk:Adaminsull|talk]]) 22:04, 11 May 2013 (UTC)&lt;br /&gt;
:You could look at the &amp;quot;database&amp;quot; file format of [[Messages]] on a freshly installed iOS device (don't use data restore). Not even a jailbreak is required, see [[iTunes Backup]]. --[[User:Http|http]] ([[User talk:Http|talk]]) 23:52, 11 May 2013 (UTC)&lt;br /&gt;
:: But how would I even find it? --[[User:Adaminsull|adaminsull]] ([[User talk:Adaminsull|talk]]) 02:36, 12 May 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=ITunes_Backup&amp;diff=33274</id>
		<title>ITunes Backup</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=ITunes_Backup&amp;diff=33274"/>
		<updated>2013-07-31T10:43:38Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* iTunes backup location */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
The following description is to describe the '''backup system of [[iTunes]]''', which is often used for forensic analysis of iDevices. This description is for the format used in the latest iTunes 10.5.3 - older versions are slightly different (see [[Understanding iPhone Backup Files|old article]]). The description is only for non-encrypted backups.&lt;br /&gt;
&lt;br /&gt;
On the iDevice there is a file &amp;lt;code&amp;gt;/System/Library/Backup/Domains.plist&amp;lt;/code&amp;gt; which determines what files to backup. There is a differentiation between &amp;quot;domains&amp;quot; and relative files.&lt;br /&gt;
&lt;br /&gt;
In the backup location (see below) there are all backups that iTunes has made so far. Every backup folder has a name made of 20 bytes in hex numbers (lower case) for a full backup. A differential backup has the same folder name, but appened with a dash and the ISO date of the backup (8 digit yyyymmdd) and a dash and the time in 24-hour format with seconds.&lt;br /&gt;
&lt;br /&gt;
In each backup, there are four files with infos, which are described later:&lt;br /&gt;
*Info.plist&lt;br /&gt;
*Manifest.mdbd&lt;br /&gt;
*Manifest.plist&lt;br /&gt;
*Status.plist&lt;br /&gt;
There are also the files themselves, but with a new file name.&lt;br /&gt;
&lt;br /&gt;
The file names are made by a SHA-1 hash of their name, together with their path and domain. Between the domain and the path there is a dash. Example:&lt;br /&gt;
 SHA1('HomeDomain-Library/SMS/sms.db') = 3d0d7e5fb2ce288813306e4d4636395e047a3d28&lt;br /&gt;
It is not clear what would happen in case of hash collisions. Probably Apple assumes it won't happen.&lt;br /&gt;
&lt;br /&gt;
The data itself is encrypted with AES-256 CBC.&lt;br /&gt;
&lt;br /&gt;
===iTunes backup location===&lt;br /&gt;
*Windows XP: &amp;lt;code&amp;gt;%HOMEPATH%\Application Data\Apple Computer\MobileSync\Backup\{UDID}&amp;lt;/code&amp;gt;&lt;br /&gt;
*Windows Vista/7/8: &amp;lt;code&amp;gt;%HOMEPATH%\AppData\Roaming\Apple Computer\MobileSync\Backup\{UDID}&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%APPDATA%\Apple Computer\MobileSync\Backup\{UDID}&amp;lt;/code&amp;gt;&lt;br /&gt;
*OS X: &amp;lt;code&amp;gt;~/Library/Application Support/MobileSync/Backup/{UDID}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Info.plist ===&lt;br /&gt;
This is a plaintext plist that contains the following dict:&lt;br /&gt;
*Build Version (string): 9A406 (iOS build version of the device that was backed up)&lt;br /&gt;
*Device Name (string): (name of the device that was backed up)&lt;br /&gt;
*Display Name (string): (name of the device that was backed up)&lt;br /&gt;
*GUID (string): unknown 16-byte GUID without any dashes&lt;br /&gt;
*ICCID (string)&lt;br /&gt;
*IMEI (string)&lt;br /&gt;
*Last Backup Date (date): format &amp;quot;yyyy-mm-ddThh:mm:ssZ&amp;quot;&lt;br /&gt;
*Phone Number (string)&lt;br /&gt;
*Product Type (string): iPhone4,1&lt;br /&gt;
*Product Version (string): 5.0.1&lt;br /&gt;
*Serial Number (string)&lt;br /&gt;
*Sync Settings (dict):&lt;br /&gt;
**Calendar Day Limit (integer): 30&lt;br /&gt;
**Calendars Collections: (array of dict, 1 element):&lt;br /&gt;
***AMSCollectionDisplayName (string): Calendar&lt;br /&gt;
***AMSCollectionFiltered (bool): false&lt;br /&gt;
***AMSCollectionName (string): Calendar&lt;br /&gt;
***AMSCollectionReadOnly (bool): false&lt;br /&gt;
**Data Class Info: (array of dict, 5 elements)&lt;br /&gt;
***[0] dict:&lt;br /&gt;
****kAMSDataClassEnabled (bool): false&lt;br /&gt;
****kAMSDataClassName (string): com.apple.Bookmarks&lt;br /&gt;
****kAMSDataClassReset (bool): false&lt;br /&gt;
***[1] dict:&lt;br /&gt;
****kAMSDataClassEnabled (bool): false&lt;br /&gt;
****kAMSDataClassName (string): com.apple.Calendars&lt;br /&gt;
****kAMSDataClassReset (bool): false&lt;br /&gt;
***[2] dict:&lt;br /&gt;
****kAMSDataClassEnabled (bool): false&lt;br /&gt;
****kAMSDataClassName (string): com.apple.Accounts&lt;br /&gt;
****kAMSDataClassReset (bool): false&lt;br /&gt;
***[3] dict:&lt;br /&gt;
****kAMSDataClassEnabled (bool): false&lt;br /&gt;
****kAMSDataClassName (string): com.apple.MailAccounts&lt;br /&gt;
****kAMSDataClassReset (bool): false&lt;br /&gt;
***[4] dict:&lt;br /&gt;
****kAMSDataClassEnabled (bool): true&lt;br /&gt;
****kAMSDataClassName (string): com.apple.Notes&lt;br /&gt;
****kAMSDataClassReset (bool): false&lt;br /&gt;
**New Record Calendar Name (string): Home&lt;br /&gt;
**iTunes User ID (string): (8-byte hex code)&lt;br /&gt;
*Target Identifier (string): 20-byte hex code&lt;br /&gt;
*Terget Type (string): Device&lt;br /&gt;
*Unique Identifier (string): same 20-byte hex code&lt;br /&gt;
*iBooks Data 2 (data): (base-64 encoded blob, see below)&lt;br /&gt;
*iTunes Files (dict):&lt;br /&gt;
**IC-Info.siv (data): (base-64 encoded blob, see below)&lt;br /&gt;
**PhotosFolderAlbums (data): (base-64 encoded blob, see below)&lt;br /&gt;
**PhotosFolderName (data): (base-64 encoded blob, see below)&lt;br /&gt;
**PhotosFolderPrefs (data): (base-64 encoded blob, see below)&lt;br /&gt;
**ShowMarketing (data): (empty)&lt;br /&gt;
**iTunesPrefs (data): (base-64 encoded blob, see below)&lt;br /&gt;
**iTunesPrefs.plist (data): (base-64 encoded blob, see below)&lt;br /&gt;
*iTunes Settings (dict):&lt;br /&gt;
**LibraryApplications (array of string): The array of string contains the identification string of each application, for example &amp;lt;code&amp;gt;com.apple.store.caseprogram&amp;lt;/code&amp;gt;&lt;br /&gt;
*iTunes Version (string): 10.5.3&lt;br /&gt;
&lt;br /&gt;
==== iBooks Data 2 ====&lt;br /&gt;
This blob is actually another plist (dict):&lt;br /&gt;
*1.2 (dict):&lt;br /&gt;
**BKBookmark (array of dict):&lt;br /&gt;
***[0] dict:&lt;br /&gt;
****bookDatabaseKey (string)&lt;br /&gt;
****date (integer)&lt;br /&gt;
****deletedFlag (bool)&lt;br /&gt;
****highlightColor (integer)&lt;br /&gt;
****lastModification (integer)&lt;br /&gt;
****locationBPlist (data): (base-64 encoded blob, see below)&lt;br /&gt;
****ordinal (integer)&lt;br /&gt;
****serverSyncUniqueId (string): Reading Location&lt;br /&gt;
****type (integer): 1&lt;br /&gt;
*CollectionsData-1.2 (dict):&lt;br /&gt;
**BKCollection (array of 2 dict):&lt;br /&gt;
***[0] dict:&lt;br /&gt;
****databaseKeys (array): (empty)&lt;br /&gt;
****lastModification_Since1970 (integer)&lt;br /&gt;
****ServerSyncUniqueId (string): Pdfs_Collenction_ID&lt;br /&gt;
****sortKey (integer): -2&lt;br /&gt;
****title (string): PDFs&lt;br /&gt;
***[1] dict:&lt;br /&gt;
****databaseKeys (array): (empty)&lt;br /&gt;
****lastModification_Since1970 (integer)&lt;br /&gt;
****ServerSyncUniqueId (string): Pdfs_Collenction_ID&lt;br /&gt;
****sortKey (integer): -1&lt;br /&gt;
****title (string): Books&lt;br /&gt;
**rolling_version (integer): 17&lt;br /&gt;
&lt;br /&gt;
===== Location BPList =====&lt;br /&gt;
This is actually a binary plist with the following content (dict): (example):&lt;br /&gt;
*class (string): BKEpubLocation&lt;br /&gt;
*endOffset (real): 0,0&lt;br /&gt;
*endPath (array of dict):&lt;br /&gt;
**[0] dict&lt;br /&gt;
***id (string): seeAlsoSection&lt;br /&gt;
***index (integer): 32&lt;br /&gt;
***tagName (string): div&lt;br /&gt;
**[1] dcit&lt;br /&gt;
***index (integer): 3&lt;br /&gt;
***tagName (string): p&lt;br /&gt;
*startOffset (real): 0.0&lt;br /&gt;
*startPath (array of dict):&lt;br /&gt;
**[0] dict:&lt;br /&gt;
***id (string): seeAlsoSection&lt;br /&gt;
***index (integer): 32&lt;br /&gt;
***tagName (string): div&lt;br /&gt;
**[1] dict:&lt;br /&gt;
***index (integer): 3&lt;br /&gt;
***tagName (string): p&lt;br /&gt;
*super (dict):&lt;br /&gt;
**class (string): BKLocation&lt;br /&gt;
**ordinal (integer): 3&lt;br /&gt;
&lt;br /&gt;
==== IC-Info.siv ====&lt;br /&gt;
binary file, content unknown&lt;br /&gt;
&lt;br /&gt;
==== PhotosFolderAlbums ====&lt;br /&gt;
[[frpd]] binary file. Starts with 0x66 0x72 0x70 0x64 ('frpd'). Then only very few bytes and the content is mostly zero. Then at 0x68 and 0x26C, 0x470, 0x674, etc. there are folder names (in unicode, starting with the name length).&lt;br /&gt;
&lt;br /&gt;
==== PhotosFolderName ====&lt;br /&gt;
A 0x200 byte long file, starting with the text &amp;quot;Pictures&amp;quot; (in unicode) and the name length before it. Rest filled with zeroes.&lt;br /&gt;
&lt;br /&gt;
==== iTunesPrefs ====&lt;br /&gt;
This is another [[frpd]] file. It contains names of computers found on the network, like iPodPrefs below.&lt;br /&gt;
&lt;br /&gt;
==== iTunesPrefs.plist ====&lt;br /&gt;
plist with this content (dict):&lt;br /&gt;
*ApplicationIDs (array of string): list of applications (like &amp;lt;code&amp;gt;com.apple.iBooks&amp;lt;/code&amp;gt;&lt;br /&gt;
*AudiobookPlaylistIDs (array): (empty)&lt;br /&gt;
*AudioTrackIDs (array): (empty)&lt;br /&gt;
*BookTrackIDs (array of integer): (signed long integer values)&lt;br /&gt;
*LibraryBookTrackIDs (array of integer): (signed long integer values)&lt;br /&gt;
*MoviePlaylistIDs (array): (empty)&lt;br /&gt;
*MovieTrackIDs (array): (empty)&lt;br /&gt;
*MusicAlbumIDs (array): (empty)&lt;br /&gt;
*MusicArtistIDs (array): (empty)&lt;br /&gt;
*MusicGenreNames (array): (empty)&lt;br /&gt;
*MusicPlaylistIDs (array of integer): (signed long integer values)&lt;br /&gt;
*MusicTrackIDs (array): (empty)&lt;br /&gt;
*PodcastChannelIDs (array): (empty)&lt;br /&gt;
*PodcastPlaylistIDs (array): (empty)&lt;br /&gt;
*PodcastTrackIDs (array of integer): (signed long integer values)&lt;br /&gt;
*RingtoneTrackIDs (array): (empty)&lt;br /&gt;
*TVShowAlbumIDs (array): (empty)&lt;br /&gt;
*TVShowNames (array): (empty)&lt;br /&gt;
*TVShowPlaylistIDs (array): (empty)&lt;br /&gt;
*TVShowTrackIDs (array): (empty)&lt;br /&gt;
*iPodPrefs (data): (base-64 encoded blob, see below)&lt;br /&gt;
*iTunesUChannelIDs (array): (empty)&lt;br /&gt;
*iTunesUPlaylistIDs (array): (empty)&lt;br /&gt;
*iTunesUTrackIDs (array): (empty)&lt;br /&gt;
&lt;br /&gt;
===== iPodPrefs =====&lt;br /&gt;
[[frpd]] file, content unknown, but it contains server names on the network it was sync'd to, like iTunesPrefs above.&lt;br /&gt;
&lt;br /&gt;
=== Manifest.mbdb ===&lt;br /&gt;
Binary file containing many text strings. Probably a database of file names in the backup. Format (from [http://code.google.com/p/iphonebackupbrowser/wiki/MbdbMbdxFormat here]):&lt;br /&gt;
==== Header ====&lt;br /&gt;
 6 bytes: 'mbdb\5\0'&lt;br /&gt;
==== Record (variable size) ====&lt;br /&gt;
 string Domain        Backup domain (one of&lt;br /&gt;
                        &amp;quot;AppDomain-com.some.user.installed.app&amp;quot;,&lt;br /&gt;
                        &amp;quot;CameraRollDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;DatabaseDomain&amp;quot;&lt;br /&gt;
                        &amp;quot;HomeDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;KeychainDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;ManagedPreferencesDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;MediaDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;MobileDeviceDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;RootDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;SystemPreferencesDomain&amp;quot;,&lt;br /&gt;
                        &amp;quot;WirelessDomain&amp;quot;,&lt;br /&gt;
                        ... others?&lt;br /&gt;
 string Path              &lt;br /&gt;
 string LinkTarget    absolute path&lt;br /&gt;
 string DataHash      SHA-1 of file contents, actual file objects only&lt;br /&gt;
 string encryptionKey      Encryption key for encrypted backups&lt;br /&gt;
 uint16 Mode           Unix file permissions. See /usr/include/stat.h  and stat(2)&lt;br /&gt;
                                file mode: 0xAxxx symbolic link (aka S_IFLNK or 00120000)&lt;br /&gt;
                                 0x4xxx directory (aka S_IFDIR or 0040000)&lt;br /&gt;
                                 0x8xxx regular file (aka S_IFREG or 0100000)&lt;br /&gt;
                                Mask out ~ 0xf000 (aka S_IFMT) for file permissions&lt;br /&gt;
 uint32 inode         inode number&lt;br /&gt;
 uint32 uid             owner    &lt;br /&gt;
 uint32 gid             group&lt;br /&gt;
 uint32 mtime        time of last modification&lt;br /&gt;
 uint32 atime         time of last access&lt;br /&gt;
 uint32 ctime         time of last change of status&lt;br /&gt;
 uint64 length        file size (always 0 for link or directory)&lt;br /&gt;
 uint8  protectionclass         unknown&lt;br /&gt;
 uint8  PropertyCount number of properties following&lt;br /&gt;
Property is a couple of strings:&lt;br /&gt;
 string name&lt;br /&gt;
 string value         can be a string or aa binary content&lt;br /&gt;
All values are big endian, strings are composed of a uint16 that contains the length or 0xffff for NULL, then the characters in UTF-8 with canonical decomposition (Unicode normalization form D).&lt;br /&gt;
&lt;br /&gt;
To determine the actual filename corresponding to a record (this will be the actual file in the mobile backup directory), calculate a sha-1 checksum of the Domain and Path seperated by '-' as follows:&lt;br /&gt;
        SHA1(&amp;lt;Domain&amp;gt;-&amp;lt;Path&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
It is possible to modify files in a mobile backup by understanding this structure as well. If you change the file contents, update the DataHash and length&lt;br /&gt;
&lt;br /&gt;
=== Manifest.plist ===&lt;br /&gt;
Binary plist with the following content (dict):&lt;br /&gt;
*Applications (dict):&lt;br /&gt;
**com.apple.iBooks (dict)&lt;br /&gt;
***CFBundleIdentifier (string): com.apple.iBooks&lt;br /&gt;
***CFBundleVersion (string): 804&lt;br /&gt;
***Path (string): /private/var/mobile/Applications/[GUID]/iBooks.app&lt;br /&gt;
**etc. for other apps&lt;br /&gt;
*BackupKeyBag (data): (base-64 encoded blob, see below)&lt;br /&gt;
*Date (date): yyyy-mm-ddThh:mm:ssZ&lt;br /&gt;
*IsEncrypted (bool): false&lt;br /&gt;
*Lockdown (dict):&lt;br /&gt;
**BuildVersion (string): 9A406&lt;br /&gt;
**DeviceName (string)&lt;br /&gt;
**ProductType (string): iPhone4,1&lt;br /&gt;
**ProductVersion (string): 5.0.1&lt;br /&gt;
**SerialNumber (string)&lt;br /&gt;
**UniqueDeviceID (string): 20-byte hex&lt;br /&gt;
**com.apple.Accessibility (dict):&lt;br /&gt;
***InvertDisplayEnabledByiTunes (bool): false&lt;br /&gt;
***MonoAudioEnabledByiTunes (bool): false&lt;br /&gt;
***VoiceOverTouchEnabledByiTunes (bool): false&lt;br /&gt;
***ZoomTouchEnabledByiTunes (bool): false&lt;br /&gt;
**com.apple.MobileDeviceCrashCopy (dict):&lt;br /&gt;
***ShouldPrompt (bool): false&lt;br /&gt;
***ShouldSubmit (bool): false&lt;br /&gt;
**com.apple.TerminalFlashr (dict): (empty)&lt;br /&gt;
**com.apple.iTunes.backup (dict):&lt;br /&gt;
***LastBackupComputerName (string)&lt;br /&gt;
***LastBackupComputerType (string): PC&lt;br /&gt;
**com.apple.itunesstored (dict):&lt;br /&gt;
***AccountAvailableServiceTypes (integer): 0&lt;br /&gt;
***AccountKind (integer): 0&lt;br /&gt;
***AccountServiceTypes (integer): 0&lt;br /&gt;
***AccountSocialEnabled (bool): false&lt;br /&gt;
***AccountStoreFront (string): (unknown text string)&lt;br /&gt;
***AccountURLBagType (string): production&lt;br /&gt;
***AppleID (string)&lt;br /&gt;
***CreditDisplayString (string): (empty string)&lt;br /&gt;
***DSPersonID (integer)&lt;br /&gt;
***TempStorefront (string): (unknown text string)&lt;br /&gt;
**com.apple.mobile.data_sync (dict):&lt;br /&gt;
***Bookmarks (dict):&lt;br /&gt;
****AccountNames (array of string, 1 element): iCloud&lt;br /&gt;
****Sources (array of string, 1 element): iCloud&lt;br /&gt;
***Calendars (dict):&lt;br /&gt;
****AccountNames (array of string, 1 element): iCloud&lt;br /&gt;
****Sources (array of string, 1 element): iCloud&lt;br /&gt;
***Contacts (dict):&lt;br /&gt;
****AccountNames (array of string, 1 element): iCloud&lt;br /&gt;
****Sources (array of string, 1 element): iCloud&lt;br /&gt;
**com.apple.mobile.iTunes.accessories (dict): (empty)&lt;br /&gt;
**com.apple.mobile.wireless_lockdown (dict): (empty)&lt;br /&gt;
*SystemDomainsVersion (string): 12.0&lt;br /&gt;
*Version (string): 9.0&lt;br /&gt;
*WasPasscodeSet (bool): false&lt;br /&gt;
&lt;br /&gt;
==== BackupKeyBag ====&lt;br /&gt;
Binary file in the following format:&lt;br /&gt;
*4-byte block identifier&lt;br /&gt;
*4-byte block length (most significant byte first), length 4 means total block length of 0xC bytes.&lt;br /&gt;
*data&lt;br /&gt;
First block is &amp;quot;VERS&amp;quot; with a version number of 3. There are a lot of block types: VERS, TYPE, UUID, HMCK, WRAP, SALT, ITER, UUID, CLAS, WRAP, KTYP, WPKY, etc.&lt;br /&gt;
&lt;br /&gt;
=== Status.plist ===&lt;br /&gt;
Binary plist with the following content (dict):&lt;br /&gt;
*BackupState (string): new&lt;br /&gt;
*Date (date): &amp;quot;yyyy-mm-ddThh:mm:ssZ&amp;quot;&lt;br /&gt;
*IsFullBackup (bool): false&lt;br /&gt;
*SnapshotState (string): finished&lt;br /&gt;
*UUID (string)&lt;br /&gt;
*Version (string): 2.4&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
Here is a list of commonly used files:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: small; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!domain&lt;br /&gt;
!path and file name&lt;br /&gt;
!SHA-1 backup file name&lt;br /&gt;
|-&lt;br /&gt;
|HomeDomain&lt;br /&gt;
|Library/SMS/sms.db&lt;br /&gt;
|3d0d7e5fb2ce288813306e4d4636395e047a3d28&lt;br /&gt;
|-&lt;br /&gt;
|HomeDomain&lt;br /&gt;
|Library/AddressBook/AddressBook.sqlitedb&lt;br /&gt;
|31bb7ba8914766d4ba40d6dfb6113c8b614be442&lt;br /&gt;
|-&lt;br /&gt;
|HomeDomain&lt;br /&gt;
|Library/Notes/notes.sqlite&lt;br /&gt;
|ca3bc056d4da0bbf88b5fb3be254f3b7147e639c&lt;br /&gt;
|-&lt;br /&gt;
|WirelessDomain&lt;br /&gt;
|Library/CallHistory/call_history.db&lt;br /&gt;
|2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
*[[:/System/Library/Backup]]&lt;br /&gt;
*[[Backup the iPhone Flash for restore without iTunes]]&lt;br /&gt;
*[[Understanding iPhone Backup Files]]&lt;br /&gt;
*[http://www.ssddfj.org/papers/SSDDFJ_V4_1_Bader_Bagilli.pdf iPhone 3GS Forensics]&lt;br /&gt;
*[http://www.scip.ch/?labs.20110512 SCIP backup infos (german only)]&lt;br /&gt;
*[http://stackoverflow.com/questions/6569004/how-to-parse-the-manifest-mbdb-file-in-an-ios-5-0-beta-2-without-manifest-mbdx SHA-1 hash generation]&lt;br /&gt;
*[http://code.google.com/p/iphonebackupbrowser/wiki/MbdbMbdxFormat description of mbdx and mbdb files]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=/Applications&amp;diff=33273</id>
		<title>/Applications</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=/Applications&amp;diff=33273"/>
		<updated>2013-07-31T10:39:06Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* Native Apps */ fixed Messages link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
This is where all of the pre-installed native apps, as well as native jailbreak apps (from Cydia and elsewhere), are installed. They can't be deleted under normal circumstances. One can delete them on a jailbroken device through some sort of file-management tool such as SSH or iFile, although doing this is highly unrecommended as they can't be re-installed.&lt;br /&gt;
&lt;br /&gt;
App Store apps are installed by iTunes in the [[/private/var/mobile/Applications]] folder.&lt;br /&gt;
&lt;br /&gt;
== Children ==&lt;br /&gt;
=== Folders ===&lt;br /&gt;
*{{ipfw|Utilities}} &lt;br /&gt;
==== Native Apps ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Folder name (generic)&lt;br /&gt;
! Folder name ([[iPad]] version)&lt;br /&gt;
! Folder name ([[Apple TV]] version)&lt;br /&gt;
! Application name&lt;br /&gt;
! 1.x&lt;br /&gt;
! 2.x&lt;br /&gt;
! 3.x&lt;br /&gt;
! 4.x &lt;br /&gt;
! 5.x&lt;br /&gt;
! 6.x&lt;br /&gt;
! 7.x&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|AACredentialRecoveryDialog.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|AdSheet.app}}&lt;br /&gt;
| {{ipfw|AdSheet~ipad.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hidden app for [[iAd]] support (Both included on iPad)&lt;br /&gt;
|-&lt;br /&gt;
| No iPhone or iPod touch version&lt;br /&gt;
| No iPad Version&lt;br /&gt;
| {{ipfw|AppleTV.app}}&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{partial|4.1.1/4.2.1+}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| The [[Apple TV]]'s equivalent of [[:/System/Library/CoreServices/SpringBoard.app|SpringBoard]]. Used on iOS 4.2 and higher.  Prior to 4.2.1, it was known as Lowtide.app.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|AppStore.app}}&lt;br /&gt;
| {{ipfw|AppStore.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| App Store&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Client for the [[App Store]]&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Calculator.app}}&lt;br /&gt;
| No iPad version&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Calculator&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Calculator. Icon evolved over major OS releases. Landscape scientific mode added in iOS 2.0.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Camera.app}}&lt;br /&gt;
| {{ipfw|Camera.app}} ([[iPad 2]] and newer only)&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Camera&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Camera.  Split from {{ipfw|MobileSlideShow.app}} starting with iOS 4.0.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Compass.app}}&lt;br /&gt;
| Included, but not accessable&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Compass&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Compass. Only available on [[Magnetometer|qualifying devices.]]&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|CompassCalibrationViewService.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Contacts~iphone.app}} (MobileAddressBook.app before iOS 4)&lt;br /&gt;
| {{ipfw|Contacts~ipad.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Contacts&lt;br /&gt;
| {{partial}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Contacts.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Copilot.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|DDActionsService.app}}&lt;br /&gt;
| {{ipfw|DDActionsService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|DemoApp.app}}&lt;br /&gt;
| {{ipfw|DemoApp.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|  &lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Displays a video continuously when the device is not being used. Invoke with a file called Demo.mov in the user directory ([[/private/var/root]] for [[iOS]] 1.1.2 and lower, [[/private/var/mobile]] for [[iOS]] 1.1.3 and later). Used by Apple Stores.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|FacebookAccountMigrationDialog.app}}&lt;br /&gt;
| {{ipfw|FacebookAccountMigrationDialog.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Facebook service.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|FaceTime.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| FaceTime&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| FaceTime application.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|FieldTest.app}}&lt;br /&gt;
| {{ipfw|FieldTest.app}} (3G only)&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{partial|See notes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hidden app for checking network parameters; Can be accessed by dialing [[Phone app codes|&amp;lt;code&amp;gt;*3001#12345#*&amp;lt;/code&amp;gt;]]; Retired in 4.0, returns in 4.1 providing only the cellular network RSSI display. [[iOS]] 4.2 brings all features back.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|GameCenterUIService.app}}&lt;br /&gt;
| {{ipfw|GameCenterUIService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|GameCenter~iphone.app}}&lt;br /&gt;
| {{ipfw|GameCenter~ipad.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Game Center&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{partial|4.1+}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Game Center.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|iAdOptOut.app}}&lt;br /&gt;
| {{ipfw|iAdOptOut.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|iOS Diagnostics.app}}&lt;br /&gt;
| {{ipfw|iOS Diagnostics.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| This can be accessed through Safari; just type diags:// into the URL bar.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|iPodOut.app}}&lt;br /&gt;
| {{ipfw|iPodOut.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hidden app for iPodOut functionality with third party equipment such as car entertainment systems. Provides a media selection and notification view interface through the video output.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|kbd.app}}&lt;br /&gt;
| {{ipfw|kbd.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MailCompositionService.app}}&lt;br /&gt;
| {{ipfw|MailCompositionService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Maps~iphone.app}} (Maps.app on iOS 7)&lt;br /&gt;
| {{ipfw|Maps~ipad.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Maps&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Maps.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MessagesViewService.app}}&lt;br /&gt;
| {{ipfw|MessagesViewService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileCal.app}}&lt;br /&gt;
| {{ipfw|MobileCal.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Calendar&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Calendar.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileMail.app}}&lt;br /&gt;
| {{ipfw|MobileMail.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Mail&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Mail. Updated in iOS 4 and iOS 7.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileMusicPlayer.app}}&lt;br /&gt;
| {{ipfw|MobileMusicPlayer.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| iPod; Music; Videos&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| iPod/Music/Videos. Uses the '''[[Application Roles]]''' feature to have more than one icon. Split into separate Music/Videos apps since iOS 5.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileNotes.app}}&lt;br /&gt;
| {{ipfw|MobileNotes.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Notes&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Notes.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobilePhone.app}}&lt;br /&gt;
| {{ipfw|MobilePhone.app}} (iPad 2 and newer only)&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Phone; FaceTime&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Only FaceTime is shown on the iPad and iPod touch. On iOS 7 FaceTime is an independent application. Uses the '''[[Application Roles]]''' feature to have more than one icon.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileSafari.app}}&lt;br /&gt;
| {{ipfw|MobileSafari.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Safari&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Mobile Safari web browser.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileSlideShow.app}}&lt;br /&gt;
| {{ipfw|MobileSlideShow.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Photos (iOS 4 and above); Photos, Camera (older OS versions)&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Photo Albums, Places, Faces*, Events* and Import°.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* &amp;lt;/nowiki&amp;gt;Mac only.&lt;br /&gt;
&lt;br /&gt;
° with iPad Camera Connection Kit&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileSMS.app}}&lt;br /&gt;
| {{ipfw|MobileSMS.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| [[Messages]]; Text (iPhone OS &amp;lt; 2.2.1)&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| SMS,MMS, iMessage&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileStore.app}}&lt;br /&gt;
| {{ipfw|MobileStore.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| iTunes&lt;br /&gt;
| {{partial|1.1}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| iTunes Store and Ping.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|MobileTimer.app}} (MobileTimer~iphone.app on iOS 6 only)&lt;br /&gt;
| {{ipfw|MobileTimer~ipad.app}} (only from iOS 6)&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Clock&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| World Clocks, Alarms, Stopwatch and countdown Timer.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Music~iphone.app}} (Music.app on iOS 7)&lt;br /&gt;
| {{ipfw|Music~ipad.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Music&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Previously part of MobileMusicPlayer.app. Icon is identical to the one previously only displayed on iPod touches.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Nike.app}}&lt;br /&gt;
| No iPad Version&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Nike+iPod&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{partial|2.2.1}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Nike+iPod. Only on applicable devices (iPod touch 2G, iPhone 3G, and newer) when enabled in Settings.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Preferences.app}}&lt;br /&gt;
| {{ipfw|Preferences.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Settings&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Settings.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|quicklookd.app}}&lt;br /&gt;
| {{ipfw|quicklookd.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Reminders.app}}&lt;br /&gt;
| {{ipfw|Reminders.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Reminders&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Reminders application.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Setup.app}}&lt;br /&gt;
| {{ipfw|Setup.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Setup&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hidden setup app. Opens automatically after a restore.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Shoebox.app}} (Passbook.app on iOS 7)&lt;br /&gt;
| {{ipfw|Shoebox.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Passbook.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|SiriView.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|ShoeboxUIService.app}} (PassbookUIService.app on iOS 7)&lt;br /&gt;
| {{ipfw|ShoeboxUIService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|SocialUIService.app}}&lt;br /&gt;
| {{ipfw|SocialUIService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Stocks.app}}&lt;br /&gt;
| No iPad Version&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Stocks&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Stocks. Updated in iPhone OS 3.0 and iOS 7.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|TrustMe.app}}&lt;br /&gt;
| {{ipfw|TrustMe.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Related to SSL and certificates.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Videos.app}}&lt;br /&gt;
| {{ipfw|Videos.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Videos&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Previously part of MobileMusicPlayer.app.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|VoiceMemos.app}}&lt;br /&gt;
| No iPad Version&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Voice Memos&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Voice Memos. Requires &amp;lt;code&amp;gt;encode-aac&amp;lt;/code&amp;gt; capability and a microphone.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Weather.app}}&lt;br /&gt;
| {{ipfw|Weather.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| Weather&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Weather. Updated for fast app switching support and hourly forecast and in iOS 6.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|Web.app}}&lt;br /&gt;
| {{ipfw|Web.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|  &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Runs fullscreen web clips.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|WebContentAnalysisUI.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|  &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|WebSheet.app}}&lt;br /&gt;
| {{ipfw|WebSheet.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
|  &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Used for overlaying web data. Usually for logging in to Wi-Fi Hotspots which use forced webpages to request user data.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|WebUIService.app}} (WebViewService on iOS 7)&lt;br /&gt;
| {{ipfw|WebUIService.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|YouTube.app}}&lt;br /&gt;
| {{ipfw|YouTube.app}}&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| YouTube&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Watch [http://youtube.com YouTube] videos; removed in iOS 6 beta 4 according with the Google License.&lt;br /&gt;
|-&lt;br /&gt;
| {{ipfw|WhatsNew.app}}&lt;br /&gt;
| ?&lt;br /&gt;
| No Apple TV Version&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Unofficial Apps ====&lt;br /&gt;
These application bundles are not present on an unmodified system and are generally installed via a PC utility, manually or through a package. More applications may be installed after jailbreak.&lt;br /&gt;
* [[Installer.app]] (AppTapp Installer)&lt;br /&gt;
* [[blackra1n.app]] ([[blackra1n]] and [[limera1n]])&lt;br /&gt;
* [[Cydia.app]] (Cydia Installer)&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
(none)&lt;br /&gt;
&lt;br /&gt;
== Parents ==&lt;br /&gt;
{{parent}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Filesystem]]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33194</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33194"/>
		<updated>2013-07-29T00:13:36Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* References */ added more references&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is a SQLite 3 database file which contains the call history from the Phone application on the iPhone.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database, version 11 is used on iOS 6.1.2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of contact that has been called/has received call from.&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, 8 for blocked calls&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Contacts or Address Book ID of the contact being called. This column would be '''-1''' if the contact is unknown (e.g. not in address book). This column is always '''-1''' on incoming calls.&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always empty&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT ''&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://avi.alkalay.net/2011/12/iphone-call-history.html iPhone Call History Database]&lt;br /&gt;
* [http://code.google.com/p/iphonelogd/wiki/CallHistoryDatabase Call History Database]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33193</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33193"/>
		<updated>2013-07-29T00:10:53Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* call */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is a SQLite 3 database file which contains the call history from the Phone application on the iPhone.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database, version 11 is used on iOS 6.1.2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of contact that has been called/has received call from.&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, 8 for blocked calls&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Contacts or Address Book ID of the contact being called. This column would be '''-1''' if the contact is unknown (e.g. not in address book). This column is always '''-1''' on incoming calls.&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always empty&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT ''&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://avi.alkalay.net/2011/12/iphone-call-history.html iPhone Call History Database]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33192</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33192"/>
		<updated>2013-07-28T23:55:30Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* call */ Added more info. Added references.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is a SQLite 3 database file which contains the call history from the Phone application on the iPhone.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database, version 11 is used on iOS 6.1.2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of contact that has been called/has received call from.&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, &lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Contacts or Address Book ID of the contact being called. This column would be '''-1''' if the contact is unknown (e.g. not in address book). This column is always '''-1''' on incoming calls.&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always empty&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT ''&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://avi.alkalay.net/2011/12/iphone-call-history.html iPhone Call History Database]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33191</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33191"/>
		<updated>2013-07-28T23:44:32Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Updated with info about the call table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is a SQLite 3 database file which contains the call history from the Phone application on the iPhone.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
All date fields is shown as number of seconds since Jan 1st, 2001.&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database, version 11 is used on iOS 6.1.2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset.&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===call===&lt;br /&gt;
This is the main table where the call history is stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Phone number or FaceTime ID of caller or whom you have called.&lt;br /&gt;
|-&lt;br /&gt;
|duration&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | number of seconds the phone call lasted&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | flag is 4 for incoming calls, 5 for outgoing calls, &lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|country_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile country code (MCC) of the country the phone was in when the call was placed. Example: '''234''' for United Kingdom. ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|network_code&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The mobile network code (MNC) of the network the phone was on when the call was placed. Example: '''30''' for T-Mobile (UK) ([http://en.wikipedia.org/wiki/Mobile_country_code list of MCC/MNC])&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER DEFAULT '1'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | read=0 if the call is an missed call, which hasn't been &amp;quot;read&amp;quot;. Example there is a (number) on the Phone icon, showing number of missed calls. read=1 if the missed calls has been checked.&lt;br /&gt;
|-&lt;br /&gt;
|assisted&lt;br /&gt;
|INTEGER DEFAULT '0'&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|face_time_data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|originalAddress&lt;br /&gt;
|TEXT DEFAULT ''&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33190</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33190"/>
		<updated>2013-07-28T23:06:03Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* _SqliteDatabaseProperties */ Had to increase the timer_liftetime&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is a SQLite 3 database file which contains the call history from the Phone application on the iPhone.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|431337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database, version 11 is used on iOS 6.1.2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset. Date is shown as number of seconds since Jan 1st, 2001&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset. Date is shown as number of seconds since Jan 1st, 2001&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33189</id>
		<title>Call History Database</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Call_History_Database&amp;diff=33189"/>
		<updated>2013-07-28T23:02:12Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Call history''' is a SQLite 3 database file which contains the call history from the Phone application on the iPhone.&lt;br /&gt;
==Serialization==&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/wireless/Library/CallHistory&amp;lt;/code&amp;gt; the file &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; is located.&lt;br /&gt;
===Database file===&lt;br /&gt;
The &amp;lt;code&amp;gt;call_history.db&amp;lt;/code&amp;gt; SQLite 3 database has the following tables:&lt;br /&gt;
* _SqliteDatabaseProperties &lt;br /&gt;
* call&lt;br /&gt;
===Tables===&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This is general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|call_history_limit&lt;br /&gt;
|100&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Sets the limit on the number of entries in the call history, increasing this value has no effect however.&lt;br /&gt;
|-&lt;br /&gt;
|timer_lifetime&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A call time counter which counts the number of seconds for all phone calls ever made (both incoming and outgoing)&lt;br /&gt;
|-&lt;br /&gt;
|data_up_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_down_last&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|data_up_all&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_down_all&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), since last statistics reset.&lt;br /&gt;
|-&lt;br /&gt;
|data_up_lifetime&lt;br /&gt;
|1337.72234523&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes sent via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|data_down_lifetime&lt;br /&gt;
|31337.56235627&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | A lifetime data counter which counts the number of megabytes received via Cellular Network Data (i.e. not WiFi), doesn't get reset on a statistics reset. &lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|CAFEBABE-F00D-DEAD-BEEF-31337ABFDEDA&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | An unique identifier for this phone&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The version of this database, version 11 is used on iOS 6.1.2&lt;br /&gt;
|-&lt;br /&gt;
|timer_last&lt;br /&gt;
|1337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The length of the last phone call (in seconds)&lt;br /&gt;
|-&lt;br /&gt;
|timer_outgoing&lt;br /&gt;
|31337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_ingoing&lt;br /&gt;
|41337&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_all&lt;br /&gt;
|72674&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The total length of all incoming/outgoing phone calls, since last statistics reset&lt;br /&gt;
|-&lt;br /&gt;
|timer_last_reset&lt;br /&gt;
|232345655.1842&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the call timer statics was last reset, usally (almost) the same as data_last_reset. Date is shown as number of seconds since Jan 1st, 2001&lt;br /&gt;
|-&lt;br /&gt;
|data_last_reset&lt;br /&gt;
|232345655.1942444&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The date the data statics was last reset, usally (almost) the same as timer_last_reset. Date is shown as number of seconds since Jan 1st, 2001&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|39461&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33188</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33188"/>
		<updated>2013-07-28T21:41:39Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* _SqliteDatabaseProperties */ Added info about counter_[in|out]_[all|lifetime]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:IMessage icon.png|thumb|Messages in iOS 5]]&lt;br /&gt;
[[Messages]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0, while support for sending and receiving iMessages was introduced in iOS 5. The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==iMessage==&lt;br /&gt;
With iOS 5 Apple introduced the iCloud based instant messaging service, iMessage, which works across different iOS devices and Mac OS X, and is the first native messaging service for iPod touch and iPad. Messages for Mac OS X was introduced with OS X Mountain Lion, and replaced the iChat instant messaging program.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). The legacy file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of outgoing messages (since last counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of outgoing messages (since forever, isn't affected by an counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of incoming messages (since last counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | counts the number of incoming messages (since forever, isn't affected by an counter reset)&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | specifies if it's an iMessage or not, value 0 or 1 (0=SMS/MMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*&amp;lt;del&amp;gt;[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&amp;lt;/del&amp;gt; (broken) ([http://web.archive.org/web/20120630170444/http://www.apple.com/ios/features.html#imessage Archive.org's archive of page])&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33186</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33186"/>
		<updated>2013-07-28T21:35:01Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* message */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:IMessage icon.png|thumb|Messages in iOS 5]]&lt;br /&gt;
[[Messages]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0, while support for sending and receiving iMessages was introduced in iOS 5. The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==iMessage==&lt;br /&gt;
With iOS 5 Apple introduced the iCloud based instant messaging service, iMessage, which works across different iOS devices and Mac OS X, and is the first native messaging service for iPod touch and iPad. Messages for Mac OS X was introduced with OS X Mountain Lion, and replaced the iChat instant messaging program.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). The legacy file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | specifies if it's an iMessage or not, value 0 or 1 (0=SMS/MMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*&amp;lt;del&amp;gt;[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&amp;lt;/del&amp;gt; (broken) ([http://web.archive.org/web/20120630170444/http://www.apple.com/ios/features.html#imessage Archive.org's archive of page])&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33185</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33185"/>
		<updated>2013-07-28T21:32:53Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* References */ the link to Apple is dead, added link to Archive.org's archive of that page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:IMessage icon.png|thumb|Messages in iOS 5]]&lt;br /&gt;
[[Messages]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0, while support for sending and receiving iMessages was introduced in iOS 5. The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==iMessage==&lt;br /&gt;
With iOS 5 Apple introduced the iCloud based instant messaging service, iMessage, which works across different iOS devices and Mac OS X, and is the first native messaging service for iPod touch and iPad. Messages for Mac OS X was introduced with OS X Mountain Lion, and replaced the iChat instant messaging program.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). The legacy file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | value 0 or 1 (0=SMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*&amp;lt;del&amp;gt;[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&amp;lt;/del&amp;gt; (broken) ([http://web.archive.org/web/20120630170444/http://www.apple.com/ios/features.html#imessage Archive.org's archive of page])&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33181</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33181"/>
		<updated>2013-07-28T21:23:03Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Havarh moved page IMessage to Messages: Renamed the page to Messages, as that's what the application is named (see discussion page)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:IMessage icon.png|thumb|Messages in iOS 5]]&lt;br /&gt;
[[Messages]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0, while support for sending and receiving iMessages was introduced in iOS 5. The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==iMessage==&lt;br /&gt;
With iOS 5 Apple introduced the iCloud based instant messaging service, iMessage, which works across different iOS devices and Mac OS X, and is the first native messaging service for iPod touch and iPad. Messages for Mac OS X was introduced with OS X Mountain Lion, and replaced the iChat instant messaging program.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). The legacy file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | value 0 or 1 (0=SMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Messages&amp;diff=33183</id>
		<title>Talk:Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Messages&amp;diff=33183"/>
		<updated>2013-07-28T21:23:03Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Havarh moved page Talk:IMessage to Talk:Messages: Renamed the page to Messages, as that's what the application is named (see discussion page)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incorrect name ==&lt;br /&gt;
&lt;br /&gt;
The correct name of this application is Messages. iMessage is just the protocol/name used for Apple's iCloud messaging-service. This can also be seen in the features section for iOS 5 as linked to in the references-section - iMessage is was a new feature in iOS 5. I'm renaming this page Messages. -[[User:Havarh|havarh]] ([[User talk:Havarh|talk]]) 21:10, 28 July 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=IMessage&amp;diff=33182</id>
		<title>IMessage</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=IMessage&amp;diff=33182"/>
		<updated>2013-07-28T21:23:03Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Havarh moved page IMessage to Messages: Renamed the page to Messages, as that's what the application is named (see discussion page)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Messages]]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:IMessage&amp;diff=33184</id>
		<title>Talk:IMessage</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:IMessage&amp;diff=33184"/>
		<updated>2013-07-28T21:23:03Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Havarh moved page Talk:IMessage to Talk:Messages: Renamed the page to Messages, as that's what the application is named (see discussion page)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Talk:Messages]]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33180</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33180"/>
		<updated>2013-07-28T21:22:23Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Renamed the page to Messages, as that's what the application is named (see discussion page)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:IMessage icon.png|thumb|Messages in iOS 5]]&lt;br /&gt;
[[Messages]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0, while support for sending and receiving iMessages was introduced in iOS 5. The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==iMessage==&lt;br /&gt;
With iOS 5 Apple introduced the iCloud based instant messaging service, iMessage, which works across different iOS devices and Mac OS X, and is the first native messaging service for iPod touch and iPad. Messages for Mac OS X was introduced with OS X Mountain Lion, and replaced the iChat instant messaging program.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). The legacy file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | value 0 or 1 (0=SMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Messages&amp;diff=33179</id>
		<title>Talk:Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Messages&amp;diff=33179"/>
		<updated>2013-07-28T21:10:46Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* Incorrect name */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incorrect name ==&lt;br /&gt;
&lt;br /&gt;
The correct name of this application is Messages. iMessage is just the protocol/name used for Apple's iCloud messaging-service. This can also be seen in the features section for iOS 5 as linked to in the references-section - iMessage is was a new feature in iOS 5. I'm renaming this page Messages. -[[User:Havarh|havarh]] ([[User talk:Havarh|talk]]) 21:10, 28 July 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=User:Havarh&amp;diff=33178</id>
		<title>User:Havarh</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=User:Havarh&amp;diff=33178"/>
		<updated>2013-07-28T20:54:11Z</updated>

		<summary type="html">&lt;p&gt;Havarh: Created page with &amp;quot;{{lowercase}} This is the userpage for havarh, an iOS/Linux/Mac OS X hacker/developer.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
This is the userpage for havarh, an iOS/Linux/Mac OS X hacker/developer.&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33171</id>
		<title>Messages</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Messages&amp;diff=33171"/>
		<updated>2013-07-28T18:49:48Z</updated>

		<summary type="html">&lt;p&gt;Havarh: /* message */ Description of subject&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
[[Image:IMessage icon.png|thumb|iMessage in iOS5]]&lt;br /&gt;
[[iMessage]] is the built-in system application to send messages. Initially (in earlier iOS versions) this was only for sending and receiving SMS (text) messages. Support for sending and receiving MMS messages was introduced in iOS 3.0 The icon on the [[SpringBoard]] is named '''Messages''', but Apple's official name is '''iMessage''' (see references). The application itself is located in &amp;lt;code&amp;gt;/Applications/MobileSMS.app/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
iMessages on iOS is activated in the same way as [[FaceTime]], with a silent SMS being sent to a carrier defined number and a successful registration SMS being returned. This 'verifies' the phone number for sending and receiving iMessages. Email (AppleID) verification does not use silent SMS, and only sends an email containing a verification link. This is the only method for iMessages on the iPad, iPod touch and Mac OS X.&lt;br /&gt;
&lt;br /&gt;
iMessage is deeply integrated and built around Apple's Push Notification Server over port 5223.&lt;br /&gt;
&lt;br /&gt;
== Serialization ==&lt;br /&gt;
To backup or restore the data of this application without [[iTunes]], the following information might be useful. Initial data for this analysis comes from an [[N88ap|iPhone 3GS]] with firmware 3.1.3, which was later restored / upgraded to an [[N90ap|iPhone 4]] and finally to an [[N94ap|iPhone 4S]] with iOS 5.0.1. On lower or higher firmware versions there are differences in the data.&lt;br /&gt;
&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;/var/mobile/Library/SMS/&amp;lt;/code&amp;gt; there are the following files:&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;sms-legacy.db&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt;&lt;br /&gt;
*folder &amp;lt;code&amp;gt;Parts&amp;lt;/code&amp;gt;&lt;br /&gt;
The files &amp;lt;code&amp;gt;sms.db-shm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sms.db-wal&amp;lt;/code&amp;gt; are probably used for indexing or search and can be recreated if deleted (?). The legacy file was not on my iPhone, but another user claimed to have this file (see jbqa reference).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; folder contains subfolders and files, which are referenced in the main database file in the table madrid_attachment (see there).&lt;br /&gt;
&lt;br /&gt;
=== Drafts ===&lt;br /&gt;
In the folder &amp;lt;code&amp;gt;Drafts&amp;lt;/code&amp;gt; there is a file &amp;lt;code&amp;gt;PENDING-recipients.plist&amp;lt;/code&amp;gt; (if there is a pending draft with already recipients added) and the content is a plist with an array of strings with the recipients (phone numbers). There is also a subfolder &amp;lt;code&amp;gt;PENDING.draft&amp;lt;/code&amp;gt; with a file &amp;lt;code&amp;gt;message.plist&amp;lt;/code&amp;gt; containing a '''dict''' with the following three values:&lt;br /&gt;
*'''markupString''': The text in HTML format (HTML encoded) that has been entered already&lt;br /&gt;
*'''resources''': array of dict for every image:&lt;br /&gt;
**'''duration''' (integer): '''0''' for images, number of seconds (duration) for videos&lt;br /&gt;
**'''exportedFilename''': (filename, without path, ending in .jpg, .png or .3gp)&lt;br /&gt;
**'''mimeType''': '''image/jpeg''' or '''image/png''' or '''video/x-internal-iphone'''&lt;br /&gt;
*'''textString''': The text that has been entered already (white spaces and line breaks retained)&lt;br /&gt;
Images are put into the markupString like this:&lt;br /&gt;
 &amp;lt;img id=&amp;quot;n&amp;quot;&lt;br /&gt;
      style=&amp;quot;display:block;margin-left:-6px;padding-top:5px;padding-bottom:3px&amp;quot;&lt;br /&gt;
      width=&amp;quot;97px&amp;quot; height=&amp;quot;110px&amp;quot;&lt;br /&gt;
      src=&amp;quot;x-ckmsgpart:4-n-0&amp;quot;&amp;gt;&lt;br /&gt;
n is the image number, starting with 0. The width varies slightly, depending on the image width/height ratio, but the height is always 110px (90px for videos). The images theirself are stored in the same folder with corresponding names like &amp;lt;code&amp;gt;data-0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data-1&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
In case of a video, the data file is not the video itself, but a bplist with this content (dict):&lt;br /&gt;
*'''CKSMSComposeOptionFilenameKey''' (string): '''/var/tmp/capture/capturedvideo.MOV''' or '''/var/tmp/capture-T0x11d520.tmp.OEBOK7/capturedvideo.MOV''' (or similar)&lt;br /&gt;
*'''CKSMSComposeOptionPreviewImageDataKey''' (data): big blob (base64 encoded)&lt;br /&gt;
For the blob, this was in my test only 5510 byte long, so it's not the movie itself. The only strings in the blob were &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot; somewhere near the beginning, so it can be assumed this is metadata or the screenshot shown in the message bubble.&lt;br /&gt;
&lt;br /&gt;
===Main database file===&lt;br /&gt;
So we're just looking at the file &amp;lt;code&amp;gt;sms.db&amp;lt;/code&amp;gt;, this is an [http://www.sqlite.org/ SQLite database] with the following tables in it:&lt;br /&gt;
*sqlite_master&lt;br /&gt;
*_SqliteDatabaseProperties&lt;br /&gt;
*msg_group&lt;br /&gt;
*group_member&lt;br /&gt;
*message&lt;br /&gt;
*msg_pieces&lt;br /&gt;
*madrid_attachment&lt;br /&gt;
*madrid_chat&lt;br /&gt;
&lt;br /&gt;
===Indexes===&lt;br /&gt;
The following indexes are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!index name&lt;br /&gt;
!table name&lt;br /&gt;
!field name(s)&lt;br /&gt;
|-&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|group_id, ROWID&lt;br /&gt;
|-&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|flags&lt;br /&gt;
|-&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|message_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|filename&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|-&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|group_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|style&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|state&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_id&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|service_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|guid&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|room_name&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|account_login&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_roomname, madrid_service&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|madrid_handle, madrid_service&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Triggers===&lt;br /&gt;
The following triggers are defined:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!trigger name&lt;br /&gt;
!criteria&amp;amp;nbsp;1&lt;br /&gt;
!criteria&amp;amp;nbsp;2&lt;br /&gt;
!action&lt;br /&gt;
|-&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN read(old.flags)&lt;br /&gt;
  AND NOT read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) + 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|&lt;br /&gt;
 AFTER UPDATE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
  AND read(new.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = new.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN NOT read(old.flags)&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET unread_count = (&lt;br /&gt;
    SELECT unread_count&lt;br /&gt;
     FROM msg_group&lt;br /&gt;
     WHERE ROWID = old.group_id&lt;br /&gt;
   ) - 1&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER INSERT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN new.ROWID &amp;gt;= IFNULL(&lt;br /&gt;
   (&lt;br /&gt;
     SELECT MAX(ROWID)&lt;br /&gt;
      FROM message&lt;br /&gt;
      WHERE message.group_id = new.group_id&lt;br /&gt;
    ), 0&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = new.ROWID&lt;br /&gt;
  WHERE ROWID = new.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 WHEN old.ROWID = (&lt;br /&gt;
   SELECT newest_message&lt;br /&gt;
    FROM msg_group&lt;br /&gt;
    WHERE ROWID = old.group_id&lt;br /&gt;
  )&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 UPDATE msg_group&lt;br /&gt;
  SET newest_message = (&lt;br /&gt;
    SELECT ROWID&lt;br /&gt;
     FROM message&lt;br /&gt;
     WHERE group_id = old.group_id&lt;br /&gt;
      AND ROWID = (&lt;br /&gt;
        SELECT max(ROWID)&lt;br /&gt;
         FROM message&lt;br /&gt;
         WHERE group_id = old.group_id&lt;br /&gt;
       )&lt;br /&gt;
   )&lt;br /&gt;
  WHERE ROWID = old.group_id;&lt;br /&gt;
|-&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|&lt;br /&gt;
 AFTER DELETE&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; |&lt;br /&gt;
 DELETE&lt;br /&gt;
  from msg_pieces&lt;br /&gt;
  where old.ROWID == msg_pieces.message_id;&lt;br /&gt;
|}&lt;br /&gt;
All defined triggers act on the table ''message'', therefore this is not mentioned in this list with a separate column.&lt;br /&gt;
&lt;br /&gt;
From the trigger statements it is visible that there must be a function called read(x) which is used on the field message.flags. As SQLite does not have this function, but is open-sourced, this has probably been added into the code to facilitate handling the read-flag of a message. Please note that there is also a column called 'read'.&lt;br /&gt;
&lt;br /&gt;
Please note that all date values are stored as a number which means the number of seconds since 1 Jan 2001.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;madrid&amp;quot; was the codename for [[iMessage]], before this was a product name (according to [[pytey]], see reference).&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===sqlite_master===&lt;br /&gt;
This table is contained in every SQLite database and contains general information about the content. It has these fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | either 'table' or 'index' or 'trigger'&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name of the table or index or trigger&lt;br /&gt;
|-&lt;br /&gt;
|tbl_name&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as name for table, related table name for index and trigger&lt;br /&gt;
|-&lt;br /&gt;
|rootpage&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | integer, internal id where to find the data (?), or 0 for trigger&lt;br /&gt;
|-&lt;br /&gt;
|sql&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | creation statement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This is the content of this table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!type&lt;br /&gt;
!name&lt;br /&gt;
!tbl_name&lt;br /&gt;
!rootpage&lt;br /&gt;
!sql&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|3&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key))&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|message&lt;br /&gt;
|message&lt;br /&gt;
|5&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB, madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER, madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER, is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER, madrid_account_guid TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|sqlite_sequence&lt;br /&gt;
|6&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE sqlite_sequence(name,seq)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_group&lt;br /&gt;
|msg_group&lt;br /&gt;
|7&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|group_member&lt;br /&gt;
|group_member&lt;br /&gt;
|8&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|9&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|13&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_attachment (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, attachment_guid TEXT, created_date INTEGER, start_date INTEGER, filename TEXT, uti_type TEXT, mime_type TEXT, transfer_state INTEGER, is_incoming INTEGER, message_id INTEGER)&lt;br /&gt;
|-&lt;br /&gt;
|table&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|25&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TABLE madrid_chat (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, style INTEGER, state INTEGER, account_id TEXT, properties BLOB, chat_identifier TEXT, service_name TEXT, guid TEXT, room_name TEXT, account_login TEXT, participants BLOB)&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_unread_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_unread&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|mark_message_read&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|insert_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER insert_newest_message AFTER INSERT ON message WHEN new.ROWID &amp;gt;= 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_newest_message&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 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&lt;br /&gt;
|-&lt;br /&gt;
|trigger&lt;br /&gt;
|delete_pieces&lt;br /&gt;
|message&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE TRIGGER delete_pieces AFTER DELETE ON message BEGIN DELETE from msg_pieces where old.ROWID == msg_pieces.message_id; END&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|sqlite_autoindex__SqliteDatabaseProperties_1&lt;br /&gt;
|_SqliteDatabaseProperties&lt;br /&gt;
|4&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_group_index&lt;br /&gt;
|message&lt;br /&gt;
|10&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_group_index ON message(group_id, ROWID)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|message_flags_index&lt;br /&gt;
|message&lt;br /&gt;
|11&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX message_flags_index ON message(flags)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|pieces_message_index&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|12&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX pieces_message_index ON msg_pieces(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_message_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|14&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_message_index ON madrid_attachment(message_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_guid_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|15&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_guid_index ON madrid_attachment(attachment_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_attachment_filename_index&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|16&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_attachment_filename_index ON madrid_attachment(filename)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_guid_index&lt;br /&gt;
|message&lt;br /&gt;
|18&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_guid_index ON message(madrid_guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|group_id_index&lt;br /&gt;
|group_member&lt;br /&gt;
|24&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX group_id_index ON group_member(group_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_style_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|26&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_style_index ON madrid_chat(style)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_state_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|27&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_state_index ON madrid_chat(state)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_id_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|23&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_id_index ON madrid_chat(account_id)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_chat_identifier_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|22&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_chat_identifier_index ON madrid_chat(chat_identifier)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_service_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_service_name_index ON madrid_chat(service_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_guid_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|20&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_guid_index ON madrid_chat(guid)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_room_name_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|19&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_room_name_index ON madrid_chat(room_name)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_chat_account_login_index&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|17&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_chat_account_login_index ON madrid_chat(account_login)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_roomname_service_index&lt;br /&gt;
|message&lt;br /&gt;
|28&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_roomname_service_index ON message(madrid_roomname, madrid_service)&lt;br /&gt;
|-&lt;br /&gt;
|index&lt;br /&gt;
|madrid_handle_service_index&lt;br /&gt;
|message&lt;br /&gt;
|29&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | CREATE INDEX madrid_handle_service_index ON message(madrid_handle, madrid_service)&lt;br /&gt;
|}&lt;br /&gt;
Please note that the values for rootpage might differ in every database.&lt;br /&gt;
&lt;br /&gt;
===_SqliteDatabaseProperties===&lt;br /&gt;
This seems to be a general-purpose table to store some configuration values.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
|-&lt;br /&gt;
|key&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|value&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; | UNIQUE(key)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These values are stored in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!key&lt;br /&gt;
!value&lt;br /&gt;
!description&lt;br /&gt;
|-&lt;br /&gt;
|counter_last_reset&lt;br /&gt;
|0&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_UniqueIdentifier&lt;br /&gt;
|960B6637-167E-44A1-86E5-90E3DFE768AC&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|_ClientVersion&lt;br /&gt;
|21&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_all&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_out_lifetime&lt;br /&gt;
|254&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_all&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|counter_in_lifetime&lt;br /&gt;
|468&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|-&lt;br /&gt;
|__CPRecordSequenceNumber&lt;br /&gt;
|2835&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===message===&lt;br /&gt;
This is the main table where all messages are stored:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or a name or a phone number (with or without spaces) of the other person (sent to or received from)&lt;br /&gt;
|-&lt;br /&gt;
|date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message date&lt;br /&gt;
|-&lt;br /&gt;
|text&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message content&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 2, 3, 5, 35, 16387. Probably a bit-set. The value 35 was set in a SMS that couldn't get sent out and is stil marked with a red exclamation mark letting you send it again.&lt;br /&gt;
|-&lt;br /&gt;
|replace&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 1, 2&lt;br /&gt;
|-&lt;br /&gt;
|svc_center&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|association_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | often 0, but sometimes a copy of the date field&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|UIFlags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unknown, possible values: 0, 4, 5, 6, 7&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always 0&lt;br /&gt;
|-&lt;br /&gt;
|subject&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The subject of an iMessage/MMS-message, or NULL if it's an SMS or if subject is not used on a iMessage/MMS-message&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or an ISO country code (eg: 'ch' for Switzerland)&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always NULL&lt;br /&gt;
|-&lt;br /&gt;
|recipients&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | normally NULL, one entry had an xml value in it&lt;br /&gt;
|-&lt;br /&gt;
|read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or 1 (Assume 0 = unread and 1 is read though Madrid messages are always 0 so it probably doesn't apply to them)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attributedBody&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | blob, content unknown. The only strings in it are &amp;quot;JFIF&amp;quot; and &amp;quot;Exif&amp;quot;, so this is probably meta-data.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_handle&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or a phone number of the other person (sender or receiver)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if pre-iOS 5.0 or 0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID (unique to the message) or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or NULL if pre-iOS 5.0&lt;br /&gt;
|-&lt;br /&gt;
|madrid_roomname&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|madrid_service&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid' or NULL if not an iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL if not an iMessage or 'p:' &amp;amp; own phone number or 'e:' &amp;amp; email registered for iMessage&lt;br /&gt;
|-&lt;br /&gt;
|madrid_flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | message type. Known values: NULL (if not an iMessage), 12289 (received), 32773 (send error), 36869 (sent), 45061 (sent), 77825 (received message containing parsed data eg: phone, email, website), 102405 (sent message containing parsed data eg: phone, email, website)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachmentInfo&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or blob. The blob contains these strings: streamtyped, NSMutableArray, NSArray, NSObject, NSMutableString, NSString, and a GUID. Format unknown.&lt;br /&gt;
|-&lt;br /&gt;
|madrid_url&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | always an empty string&lt;br /&gt;
|-&lt;br /&gt;
|madrid_error&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string if message is pre-iOS 5.0 or 0 if after&lt;br /&gt;
|-&lt;br /&gt;
|is_madrid&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | value 0 or 1 (0=SMS, 1=iMessage)&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_read&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a sent iMessage, integer value representing the date read&lt;br /&gt;
|-&lt;br /&gt;
|madrid_date_delivered&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | null if message is pre-iOS 5.0, 0 if sms or a received iMessage, integer value representing the date sent&lt;br /&gt;
|-&lt;br /&gt;
|madrid_account_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of account used (multiple entries may be found representing either the phone or email registered with iMessage) or empty if not an iMessage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===sqlite_sequence===&lt;br /&gt;
This table does not define data types. This is the data in the table:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!name&lt;br /&gt;
!seq&lt;br /&gt;
|-&lt;br /&gt;
|msg_group&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
|784&lt;br /&gt;
|-&lt;br /&gt;
|group_member&lt;br /&gt;
|71&lt;br /&gt;
|-&lt;br /&gt;
|msg_pieces&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_chat&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|madrid_attachment&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_group===&lt;br /&gt;
This defines a chat (SMS/text/message) conversation group.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|type&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 if only one recipient, 1 if multiple recipients&lt;br /&gt;
|-&lt;br /&gt;
|newest_message&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message. This value is auto-updated by triggers when inserting / deleting a message, so that this always points to the newest message.&lt;br /&gt;
|-&lt;br /&gt;
|unread_count&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | The number of unread messages in this group. This value is auto-incremented/decremented by triggers when inserting or deleting an unread message or when marking a message as read or unread.&lt;br /&gt;
|-&lt;br /&gt;
|hash&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | signed 32-bit integer value (calculation?)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===group_member===&lt;br /&gt;
This defines the member of the chat (SMS/text/message) conversation group. As you currently cannot define groups, there is always only one member in each group, so the group_id and ROWID values match.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|group_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to msg_group.ROWID&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | name or phone number (with or without spaces)&lt;br /&gt;
|-&lt;br /&gt;
|country&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | ISO country code eg: 'ch' for Switzerland&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===msg_pieces===&lt;br /&gt;
This table contains information about MMS objects. (?)&lt;br /&gt;
&lt;br /&gt;
When a message is deleted, a trigger checks if there are related entries in this table here and deletes them also.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | foreign key to message&lt;br /&gt;
|-&lt;br /&gt;
|data&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|part_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|preview_part&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0 or -1&lt;br /&gt;
|-&lt;br /&gt;
|content_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | empty string or 'image/jpeg'&lt;br /&gt;
|-&lt;br /&gt;
|height&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
|flags&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|content_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL or 1&lt;br /&gt;
|-&lt;br /&gt;
|content_loc&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | image file name without path (like 'IMG_0104.JPG')&lt;br /&gt;
|-&lt;br /&gt;
|headers&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_attachment===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|attachment_guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID - this matches the subfolder name in the folder &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|created_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | unsigned integer value with the creation date&lt;br /&gt;
|-&lt;br /&gt;
|start_date&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|filename&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | complete filename (with path)&lt;br /&gt;
|-&lt;br /&gt;
|uti_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'public.jpeg' or 'public.vcard'&lt;br /&gt;
|-&lt;br /&gt;
|mime_type&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'image/jpeg' or 'text/vcard'&lt;br /&gt;
|-&lt;br /&gt;
|transfer_state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
|is_incoming&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 0&lt;br /&gt;
|-&lt;br /&gt;
|message_id&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | -1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===madrid_chat===&lt;br /&gt;
In my case there are three entries in this table.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size: smaller; text-align: center; table-layout: fixed; border-collapse: collapse;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!field name&lt;br /&gt;
!type&lt;br /&gt;
!value / description&lt;br /&gt;
|-&lt;br /&gt;
|ROWID&lt;br /&gt;
|INTEGER PRIMARY KEY AUTOINCREMENT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | primary key&lt;br /&gt;
|-&lt;br /&gt;
|style&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 45&lt;br /&gt;
|-&lt;br /&gt;
|state&lt;br /&gt;
|INTEGER&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | Only known value is 3&lt;br /&gt;
|-&lt;br /&gt;
|account_id&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | GUID of the iMessage account you used&lt;br /&gt;
|-&lt;br /&gt;
|properties&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL for the second row or a bplist (see below)&lt;br /&gt;
|-&lt;br /&gt;
|chat_identifier&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | phone number of the other person in international format, no spaces &lt;br /&gt;
|-&lt;br /&gt;
|service_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'Madrid'&lt;br /&gt;
|-&lt;br /&gt;
|guid&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | same as chat_identifier, but with a '-' in front of it&lt;br /&gt;
|-&lt;br /&gt;
|room_name&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | NULL&lt;br /&gt;
|-&lt;br /&gt;
|account_login&lt;br /&gt;
|TEXT&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | 'P:' &amp;amp; own phone number or 'E:' &amp;amp; email registered for iMessage &lt;br /&gt;
|-&lt;br /&gt;
|participants&lt;br /&gt;
|BLOB&lt;br /&gt;
|style=&amp;quot;text-align:left;&amp;quot; | bplist (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the properties bplist this contains the following settings for the first row (dict):&lt;br /&gt;
*CKMadridServiceConsecutiveCanceledMessageCount (integer) = 2&lt;br /&gt;
*CKMadridServiceLastCanceledMessageTime (real) = date/time value&lt;br /&gt;
or this for the third row (dict):&lt;br /&gt;
*CKPlaceholderTimeSince1970Property (real) = date/time value&lt;br /&gt;
Please note that the date/time values here are the number of seconds since 1&amp;amp;nbsp;Jan&amp;amp;nbsp;1970 and not since 2001 like in the other database fields. There are also fractions of a second (up to seven digits).&lt;br /&gt;
&lt;br /&gt;
For the participants bplist, in all three rows there is the same content (array):&lt;br /&gt;
*(string): a phone number, not my own, in international format, no spaces&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that the phone number of the participants list matches the phone number of the first row. The people in the second and third row don't know the person from the participants list. Probably this is garbage in this table or its implementation is not finished yet. I also don't have any related messages.&lt;br /&gt;
&lt;br /&gt;
The field ''chat_identifier'' seems to be unique. This table is probably an index of iMessage contacts.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
*[http://imfreedom.org/wiki/IMessage Information based on examination of the Messages Beta application for Mac OS X]&lt;br /&gt;
*[http://www.apple.com/ios/features.html#imessage Apple's description of iMessage]&lt;br /&gt;
*[http://blog.cryptographyengineering.com/2012/08/dear-apple-please-set-imessage-free.html Critics on protocol by Matthew Green]&lt;br /&gt;
*[http://www.scip.ch/?labs.20111103 SCIP article (german only)]&lt;br /&gt;
*[http://twitter.com/#!/pytey/status/127644352091664384 pytey explaining &amp;quot;Madrid&amp;quot;]&lt;br /&gt;
*[http://www.jailbreakqa.com/questions/92827/how-to-backuprestore-sms-without-itunes jbqa: How to backup/restore SMS without iTunes]&lt;br /&gt;
*[http://smsmerge.homedns.org/ script to merge two SMS databases]&lt;/div&gt;</summary>
		<author><name>Havarh</name></author>
		
	</entry>
</feed>