summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md15
-rw-r--r--copy-mmssms-db.php69
2 files changed, 84 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6bc6ee9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# android-sms-65-to-64-workaround
+
+So you just updated your CyanogenMod 12.1, probably to "stable" snapshot build, and now your SMS app is crashing with error `android.database.sqlite.SQLiteException: Can't downgrade database from version 65 to 64`, you know that you can just delete `/data/data/com.android.providers.telephony/mmssms.db` file, reboot and be happy, but you can't be happy because you must save your messages? Okay, this is what I faced and here is what you can do.
+
+ - copy your `mmssms.db` file to computer (this will be the source)
+ - delete it on device, reboot and copy the newly created `mmssms.db` (this will be the destination)
+ - put the names of your src and dst files in the script
+ - run it (you need PHP with SQLite3 installed)
+ - replace `mmssms.db` on your device with your dst file
+ - reboot
+ - be happy
+
+This script just copies content of some tables from old to the new db. Feel free to improve it.
+
+Hope this will help somebody.
diff --git a/copy-mmssms-db.php b/copy-mmssms-db.php
new file mode 100644
index 0000000..4bfeef8
--- /dev/null
+++ b/copy-mmssms-db.php
@@ -0,0 +1,69 @@
+<?php
+
+// place paths to your files here
+$src_path = '';
+$dst_path = '';
+
+$src = new SQLite3($src_path);
+$dst = new SQLite3($dst_path);
+
+function copy_canonical_addresses() {
+ global $src, $dst;
+ $q = $src->query("SELECT * FROM canonical_addresses");
+ while ($row = $q->fetchArray(SQLITE3_ASSOC)) {
+ $dst->query("INSERT INTO canonical_addresses (_id, address) VALUES (".$row['_id'].", '".SQLite3::escapeString($row['address'])."')");
+ }
+}
+
+function copy_sms() {
+ global $src, $dst;
+ $q = $src->query("SELECT * FROM sms");
+ while ($row = $q->fetchArray(SQLITE3_ASSOC)) {
+ $keys = [];
+ $values = [];
+ foreach ($row as $key => $value) {
+ $keys[] = "`".$key."`";
+ $values[] = "'".SQLite3::escapeString($value)."'";
+ }
+ $dst->query("INSERT INTO sms (".implode(', ', $keys).") VALUES (".implode(', ', $values).")");
+ }
+}
+
+function copy_threads() {
+ global $src, $dst;
+ $q = $src->query("SELECT * FROM threads");
+ while ($row = $q->fetchArray(SQLITE3_ASSOC)) {
+ $keys = [];
+ $values = [];
+ foreach ($row as $key => $value) {
+ if ($key == 'unread_message_count') {
+ continue;
+ }
+ $keys[] = "`".$key."`";
+ $values[] = "'".SQLite3::escapeString($value)."'";
+ }
+ $dst->query("INSERT INTO threads (".implode(', ', $keys).") VALUES (".implode(', ', $values).")");
+ }
+}
+
+function copy_words() {
+ global $src, $dst;
+ $tables = ['words', 'words_content', 'words_segments', 'words_segdir'];
+ foreach ($tables as $table) {
+ $q = $src->query("SELECT * FROM {$table}");
+ while ($row = $q->fetchArray(SQLITE3_ASSOC)) {
+ $keys = [];
+ $values = [];
+ foreach ($row as $key => $value) {
+ $keys[] = "`".$key."`";
+ $values[] = "'".SQLite3::escapeString($value)."'";
+ }
+ $dst->query("INSERT INTO {$table} (".implode(', ', $keys).") VALUES (".implode(', ', $values).")");
+ }
+ }
+}
+
+copy_threads();
+copy_words();
+copy_sms();
+copy_canonical_addresses();