diff options
author | Amit Mahajan <amitmahajan@google.com> | 2015-05-14 17:22:09 -0700 |
---|---|---|
committer | Amit Mahajan <amitmahajan@google.com> | 2015-05-21 12:03:21 -0700 |
commit | 899cc608a59165a70eb13a3850ee5c580181a296 (patch) | |
tree | 07f1d98c97f147a8802f03fa7670867ebe6d6be8 | |
parent | e546580032447f846151357608d5fa576deff5bb (diff) | |
download | android_packages_providers_TelephonyProvider-899cc608a59165a70eb13a3850ee5c580181a296.tar.gz android_packages_providers_TelephonyProvider-899cc608a59165a70eb13a3850ee5c580181a296.tar.bz2 android_packages_providers_TelephonyProvider-899cc608a59165a70eb13a3850ee5c580181a296.zip |
Change to preserve user/carrer added/edited APNs on upgrade.
Bug: 21113962
Change-Id: Id9baa79e983942a8c8f933fa52ccf1a431f7c5b5
-rw-r--r-- | src/com/android/providers/telephony/TelephonyProvider.java | 414 |
1 files changed, 287 insertions, 127 deletions
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java index 8cb01dc..ab20f2c 100644 --- a/src/com/android/providers/telephony/TelephonyProvider.java +++ b/src/com/android/providers/telephony/TelephonyProvider.java @@ -46,7 +46,6 @@ import android.text.TextUtils; import android.util.Log; import android.util.Xml; -import com.android.internal.telephony.RILConstants; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; @@ -59,7 +58,6 @@ import java.io.IOException; import java.lang.NumberFormatException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; public class TelephonyProvider extends ContentProvider @@ -99,6 +97,7 @@ public class TelephonyProvider extends ContentProvider private static final String PARTNER_APNS_PATH = "etc/apns-conf.xml"; private static final String OEM_APNS_PATH = "telephony/apns-conf.xml"; private static final String OTA_UPDATED_APNS_PATH = "misc/apns-conf.xml"; + private static final String OLD_APNS_PATH = "etc/old-apns-conf.xml"; private static final UriMatcher s_urlMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -481,17 +480,44 @@ public class TelephonyProvider extends ContentProvider // This version added a new column user_edited to carriers db. } if (oldVersion < (15 << 16 | 6)) { - Cursor c = db.query(CARRIERS_TABLE, null, null, null, null, null, null); + // Most devices should be upgrading from version 13. On upgrade new db will be + // populated from the xml included in OTA but user and carrier edited/added entries + // need to be preserved. This new version also adds new columns EDITED and + // BEARER_BITMASK to the table. Upgrade steps from version 13 are: + // 1. preserve user and carrier added/edited APNs (by comparing against + // old-apns-conf.xml included in OTA) - done in preserveUserAndCarrierApns() + // 2. add new columns EDITED and BEARER_BITMASK (create a new table for that) - done + // in createCarriersTable() + // 3. copy over preserved APNs from old table to new table - done in + // copyPreservedApnsToNewTable() + // The only exception if upgrading from version 14 is that EDITED field is already + // present (but is called USER_EDITED) + Cursor c; + String[] proj = {"_id"}; if (VDBG) { + c = db.query(CARRIERS_TABLE, proj, null, null, null, null, null); log("dbh.onUpgrade:- before upgrading total number of rows: " + c.getCount()); } + + // Compare db with old apns xml file so that any user or carrier edited/added + // entries can be preserved across upgrade + preserveUserAndCarrierApns(db); + + c = db.query(CARRIERS_TABLE, null, null, null, null, null, null); + + if (VDBG) { + log("dbh.onUpgrade:- after preserveUserAndCarrierApns() total number of " + + "rows: " + ((c == null) ? 0 : c.getCount())); + } + createCarriersTable(db, CARRIERS_TABLE_TMP); if (oldVersion < (14 << 16 | 6)) { - populateNewTable(db, c, 13); + copyPreservedApnsToNewTable(db, c, 13); } else { - populateNewTable(db, c, 14); + copyPreservedApnsToNewTable(db, c, 14); } + c.close(); db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_TABLE); @@ -499,7 +525,6 @@ public class TelephonyProvider extends ContentProvider ";"); if (VDBG) { - String[] proj = {"_id"}; c = db.query(CARRIERS_TABLE, proj, null, null, null, null, null); log("dbh.onUpgrade:- after upgrading total number of rows: " + c.getCount()); c.close(); @@ -512,8 +537,8 @@ public class TelephonyProvider extends ContentProvider null, null, null, null); log("dbh.onUpgrade:- after upgrading total number of rows with edited!=" + Telephony.Carriers.UNEDITED + ": " + c.getCount()); + c.close(); } - c.close(); oldVersion = 15 << 16 | 6; } @@ -522,146 +547,281 @@ public class TelephonyProvider extends ContentProvider } } - private void populateNewTable(SQLiteDatabase db, Cursor c, int oldVersion) { + private void preserveUserAndCarrierApns(SQLiteDatabase db) { + if (VDBG) log("preserveUserAndCarrierApns"); + XmlPullParser confparser; + File confFile = new File(Environment.getRootDirectory(), OLD_APNS_PATH); + FileReader confreader = null; + try { + confreader = new FileReader(confFile); + confparser = Xml.newPullParser(); + confparser.setInput(confreader); + XmlUtils.beginDocument(confparser, "apns"); + + deleteMatchingApns(db, confparser); + } catch (FileNotFoundException e) { + // This function is called only when upgrading db to version 15. Details about the + // upgrade are mentioned in onUpgrade(). This file missing means user/carrier added + // APNs cannot be preserved. Throw an exception so that OEMs know they need to + // include old apns file for comparison. + loge("preserveUserAndCarrierApns: FileNotFoundException"); + throw new RuntimeException("preserveUserAndCarrierApns: " + OLD_APNS_PATH + + " not found. It is needed to upgrade from older versions of APN " + + "db while preserving user/carrier added/edited entries."); + } catch (Exception e) { + loge("preserveUserAndCarrierApns: Exception while parsing '" + + confFile.getAbsolutePath() + "'" + e); + } finally { + if (confreader != null) { + try { + confreader.close(); + } catch (IOException e) { + // do nothing + } + } + } + } + + private void deleteMatchingApns(SQLiteDatabase db, XmlPullParser parser) { + if (VDBG) log("deleteMatchingApns"); + if (parser != null) { + if (VDBG) log("deleteMatchingApns: parser != null"); + try { + XmlUtils.nextElement(parser); + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + ContentValues row = getRow(parser); + if (row == null) { + throw new XmlPullParserException("Expected 'apn' tag", parser, null); + } + deleteRow(db, row); + XmlUtils.nextElement(parser); + } + } catch (XmlPullParserException e) { + loge("deleteMatchingApns: Got XmlPullParserException while deleting apns." + e); + } catch (IOException e) { + loge("deleteMatchingApns: Got IOException while deleting apns." + e); + } catch (SQLException e) { + loge("deleteMatchingApns: Got SQLException while deleting apns." + e); + } + } + } + + private void deleteRow(SQLiteDatabase db, ContentValues values) { + if (VDBG) log("deleteRow"); + String where = "numeric=? and mcc=? and mnc=? and name=? and " + + "(apn=? or apn is null) and " + + "(user=? or user is null) and (server=? or server is null) and " + + "(password=? or password is null) and (proxy=? or proxy is null) and " + + "(port=? or port is null) and (mmsproxy=? or mmsproxy is null) and " + + "(mmsport=? or mmsport is null) and (mmsc=? or mmsc is null) and " + + "(authtype=? or authtype is null) and (type=? or type is null) and " + + "(protocol=? or protocol is null) and " + + "(roaming_protocol=? or roaming_protocol is null) and " + + "(carrier_enabled=? or carrier_enabled=? or carrier_enabled is null) and " + + "(bearer=? or bearer is null) and (mvno_type=? or mvno_type is null) and " + + "(mvno_match_data=? or mvno_match_data is null) and " + + "(profile_id=? or profile_id is null) and " + + "(modem_cognitive=? or modem_cognitive=? or modem_cognitive is null) and " + + "(max_conns=? or max_conns is null) and " + + "(wait_time=? or wait_time is null) and " + + "(max_conns_time=? or max_conns_time is null) and (mtu=? or mtu is null)"; + String[] whereArgs = new String[29]; + int i = 0; + whereArgs[i++] = values.getAsString(Telephony.Carriers.NUMERIC); + whereArgs[i++] = values.getAsString(Telephony.Carriers.MCC); + whereArgs[i++] = values.getAsString(Telephony.Carriers.MNC); + whereArgs[i++] = values.getAsString(Telephony.Carriers.NAME); + whereArgs[i++] = values.containsKey(Telephony.Carriers.APN) ? + values.getAsString(Telephony.Carriers.APN) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.USER) ? + values.getAsString(Telephony.Carriers.USER) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.SERVER) ? + values.getAsString(Telephony.Carriers.SERVER) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.PASSWORD) ? + values.getAsString(Telephony.Carriers.PASSWORD) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.PROXY) ? + values.getAsString(Telephony.Carriers.PROXY) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.PORT) ? + values.getAsString(Telephony.Carriers.PORT) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MMSPROXY) ? + values.getAsString(Telephony.Carriers.MMSPROXY) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MMSPORT) ? + values.getAsString(Telephony.Carriers.MMSPORT) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MMSC) ? + values.getAsString(Telephony.Carriers.MMSC) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.AUTH_TYPE) ? + values.getAsString(Telephony.Carriers.AUTH_TYPE) : "-1"; + whereArgs[i++] = values.containsKey(Telephony.Carriers.TYPE) ? + values.getAsString(Telephony.Carriers.TYPE) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.PROTOCOL) ? + values.getAsString(Telephony.Carriers.PROTOCOL) : "IP"; + whereArgs[i++] = values.containsKey(Telephony.Carriers.ROAMING_PROTOCOL) ? + values.getAsString(Telephony.Carriers.ROAMING_PROTOCOL) : "IP"; + + if (values.containsKey(Telephony.Carriers.CARRIER_ENABLED) && + (values.getAsString(Telephony.Carriers.CARRIER_ENABLED). + equalsIgnoreCase("false") || + values.getAsString(Telephony.Carriers.CARRIER_ENABLED).equals("0"))) { + whereArgs[i++] = "false"; + whereArgs[i++] = "0"; + } else { + whereArgs[i++] = "true"; + whereArgs[i++] = "1"; + } + + whereArgs[i++] = values.containsKey(Telephony.Carriers.BEARER) ? + values.getAsString(Telephony.Carriers.BEARER) : "0"; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MVNO_TYPE) ? + values.getAsString(Telephony.Carriers.MVNO_TYPE) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MVNO_MATCH_DATA) ? + values.getAsString(Telephony.Carriers.MVNO_MATCH_DATA) : ""; + whereArgs[i++] = values.containsKey(Telephony.Carriers.PROFILE_ID) ? + values.getAsString(Telephony.Carriers.PROFILE_ID) : "0"; + + if (values.containsKey(Telephony.Carriers.MODEM_COGNITIVE) && + (values.getAsString(Telephony.Carriers.MODEM_COGNITIVE). + equalsIgnoreCase("true") || + values.getAsString(Telephony.Carriers.MODEM_COGNITIVE).equals("1"))) { + whereArgs[i++] = "true"; + whereArgs[i++] = "1"; + } else { + whereArgs[i++] = "false"; + whereArgs[i++] = "0"; + } + + whereArgs[i++] = values.containsKey(Telephony.Carriers.MAX_CONNS) ? + values.getAsString(Telephony.Carriers.MAX_CONNS) : "0"; + whereArgs[i++] = values.containsKey(Telephony.Carriers.WAIT_TIME) ? + values.getAsString(Telephony.Carriers.WAIT_TIME) : "0"; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MAX_CONNS_TIME) ? + values.getAsString(Telephony.Carriers.MAX_CONNS_TIME) : "0"; + whereArgs[i++] = values.containsKey(Telephony.Carriers.MTU) ? + values.getAsString(Telephony.Carriers.MTU) : "0"; + + if (VDBG) { + log("deleteRow: where: " + where); + + StringBuilder builder = new StringBuilder(); + for (String s : whereArgs) { + builder.append(s + ", "); + } + + log("deleteRow: whereArgs: " + builder.toString()); + } + db.delete(CARRIERS_TABLE, where, whereArgs); + } + + private void copyPreservedApnsToNewTable(SQLiteDatabase db, Cursor c, int oldVersion) { // Move entries from CARRIERS_TABLE to CARRIERS_TABLE_TMP if (c != null) { String[] persistApnsForPlmns = mContext.getResources().getStringArray( R.array.persist_apns_for_plmn); while (c.moveToNext()) { - // only add those rows that will not be deleted as part of upgrade - if (rowPersistedAfterUpgrade(c, oldVersion)) { - ContentValues cv = new ContentValues(); - String val; - - // Include only non-null values in cv so that null values can be replaced - // with default if there's a default value for the field - - // String vals - getStringValueFromCursor(cv, c, Telephony.Carriers.NAME); - getStringValueFromCursor(cv, c, Telephony.Carriers.NUMERIC); - getStringValueFromCursor(cv, c, Telephony.Carriers.MCC); - getStringValueFromCursor(cv, c, Telephony.Carriers.MNC); - getStringValueFromCursor(cv, c, Telephony.Carriers.APN); - getStringValueFromCursor(cv, c, Telephony.Carriers.USER); - getStringValueFromCursor(cv, c, Telephony.Carriers.SERVER); - getStringValueFromCursor(cv, c, Telephony.Carriers.PASSWORD); - getStringValueFromCursor(cv, c, Telephony.Carriers.PROXY); - getStringValueFromCursor(cv, c, Telephony.Carriers.PORT); - getStringValueFromCursor(cv, c, Telephony.Carriers.MMSPROXY); - getStringValueFromCursor(cv, c, Telephony.Carriers.MMSPORT); - getStringValueFromCursor(cv, c, Telephony.Carriers.MMSC); - getStringValueFromCursor(cv, c, Telephony.Carriers.TYPE); - getStringValueFromCursor(cv, c, Telephony.Carriers.PROTOCOL); - getStringValueFromCursor(cv, c, Telephony.Carriers.ROAMING_PROTOCOL); - getStringValueFromCursor(cv, c, Telephony.Carriers.MVNO_TYPE); - getStringValueFromCursor(cv, c, Telephony.Carriers.MVNO_MATCH_DATA); - - // bool/int vals - getIntValueFromCursor(cv, c, Telephony.Carriers.AUTH_TYPE); - getIntValueFromCursor(cv, c, Telephony.Carriers.CURRENT); - getIntValueFromCursor(cv, c, Telephony.Carriers.CARRIER_ENABLED); - getIntValueFromCursor(cv, c, Telephony.Carriers.BEARER); - getIntValueFromCursor(cv, c, Telephony.Carriers.SUBSCRIPTION_ID); - getIntValueFromCursor(cv, c, Telephony.Carriers.PROFILE_ID); - getIntValueFromCursor(cv, c, Telephony.Carriers.MODEM_COGNITIVE); - getIntValueFromCursor(cv, c, Telephony.Carriers.MAX_CONNS); - getIntValueFromCursor(cv, c, Telephony.Carriers.WAIT_TIME); - getIntValueFromCursor(cv, c, Telephony.Carriers.MAX_CONNS_TIME); - getIntValueFromCursor(cv, c, Telephony.Carriers.MTU); - - // Change bearer to a bitmask - String bearerStr = c.getString(c.getColumnIndex(Telephony.Carriers.BEARER)); - if (!TextUtils.isEmpty(bearerStr)) { - int bearer_bitmask = ServiceState.getBitmaskForTech( - Integer.parseInt(bearerStr)); - cv.put(Telephony.Carriers.BEARER_BITMASK, bearer_bitmask); - } + ContentValues cv = new ContentValues(); + String val; + + // Include only non-null values in cv so that null values can be replaced + // with default if there's a default value for the field + + // String vals + getStringValueFromCursor(cv, c, Telephony.Carriers.NAME); + getStringValueFromCursor(cv, c, Telephony.Carriers.NUMERIC); + getStringValueFromCursor(cv, c, Telephony.Carriers.MCC); + getStringValueFromCursor(cv, c, Telephony.Carriers.MNC); + getStringValueFromCursor(cv, c, Telephony.Carriers.APN); + getStringValueFromCursor(cv, c, Telephony.Carriers.USER); + getStringValueFromCursor(cv, c, Telephony.Carriers.SERVER); + getStringValueFromCursor(cv, c, Telephony.Carriers.PASSWORD); + getStringValueFromCursor(cv, c, Telephony.Carriers.PROXY); + getStringValueFromCursor(cv, c, Telephony.Carriers.PORT); + getStringValueFromCursor(cv, c, Telephony.Carriers.MMSPROXY); + getStringValueFromCursor(cv, c, Telephony.Carriers.MMSPORT); + getStringValueFromCursor(cv, c, Telephony.Carriers.MMSC); + getStringValueFromCursor(cv, c, Telephony.Carriers.TYPE); + getStringValueFromCursor(cv, c, Telephony.Carriers.PROTOCOL); + getStringValueFromCursor(cv, c, Telephony.Carriers.ROAMING_PROTOCOL); + getStringValueFromCursor(cv, c, Telephony.Carriers.MVNO_TYPE); + getStringValueFromCursor(cv, c, Telephony.Carriers.MVNO_MATCH_DATA); + + // bool/int vals + getIntValueFromCursor(cv, c, Telephony.Carriers.AUTH_TYPE); + getIntValueFromCursor(cv, c, Telephony.Carriers.CURRENT); + getIntValueFromCursor(cv, c, Telephony.Carriers.CARRIER_ENABLED); + getIntValueFromCursor(cv, c, Telephony.Carriers.BEARER); + getIntValueFromCursor(cv, c, Telephony.Carriers.SUBSCRIPTION_ID); + getIntValueFromCursor(cv, c, Telephony.Carriers.PROFILE_ID); + getIntValueFromCursor(cv, c, Telephony.Carriers.MODEM_COGNITIVE); + getIntValueFromCursor(cv, c, Telephony.Carriers.MAX_CONNS); + getIntValueFromCursor(cv, c, Telephony.Carriers.WAIT_TIME); + getIntValueFromCursor(cv, c, Telephony.Carriers.MAX_CONNS_TIME); + getIntValueFromCursor(cv, c, Telephony.Carriers.MTU); + + // Change bearer to a bitmask + String bearerStr = c.getString(c.getColumnIndex(Telephony.Carriers.BEARER)); + if (!TextUtils.isEmpty(bearerStr)) { + int bearer_bitmask = ServiceState.getBitmaskForTech( + Integer.parseInt(bearerStr)); + cv.put(Telephony.Carriers.BEARER_BITMASK, bearer_bitmask); + } - if (oldVersion == 14) { - String user_edited = c.getString(c.getColumnIndex("user_edited")); - if (!TextUtils.isEmpty(user_edited)) { - cv.put(Telephony.Carriers.EDITED, new Integer(user_edited)); - } + if (oldVersion == 14) { + String user_edited = c.getString(c.getColumnIndex("user_edited")); + if (!TextUtils.isEmpty(user_edited)) { + cv.put(Telephony.Carriers.EDITED, new Integer(user_edited)); } + } else { + cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED); + } - // New EDITED column. Default value (Telephony.Carriers.UNEDITED) will - // be used for all rows except for non-mvno entries for plmns indicated - // by resource: those will be set to CARRIER_EDITED to preserve - // their current values - val = c.getString(c.getColumnIndex(Telephony.Carriers.NUMERIC)); - for (String s : persistApnsForPlmns) { - if (!TextUtils.isEmpty(val) && val.equals(s) && - (!cv.containsKey(Telephony.Carriers.MVNO_TYPE) || - TextUtils.isEmpty(cv.getAsString(Telephony.Carriers. - MVNO_TYPE)))) { - if (oldVersion == 13) { + // New EDITED column. Default value (Telephony.Carriers.UNEDITED) will + // be used for all rows except for non-mvno entries for plmns indicated + // by resource: those will be set to CARRIER_EDITED to preserve + // their current values + val = c.getString(c.getColumnIndex(Telephony.Carriers.NUMERIC)); + for (String s : persistApnsForPlmns) { + if (!TextUtils.isEmpty(val) && val.equals(s) && + (!cv.containsKey(Telephony.Carriers.MVNO_TYPE) || + TextUtils.isEmpty(cv.getAsString(Telephony.Carriers. + MVNO_TYPE)))) { + if (oldVersion == 13) { + cv.put(Telephony.Carriers.EDITED, + Telephony.Carriers.CARRIER_EDITED); + } else { // if (oldVersion == 14) + if (cv.getAsInteger(Telephony.Carriers.EDITED) == + Telephony.Carriers.USER_EDITED) { cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.CARRIER_EDITED); - } else { // if (oldVersion == 14) - if (cv.getAsInteger(Telephony.Carriers.EDITED) == - Telephony.Carriers.USER_EDITED) { - cv.put(Telephony.Carriers.EDITED, - Telephony.Carriers.CARRIER_EDITED); - } } - - break; } - } - try { - db.insertWithOnConflict(CARRIERS_TABLE_TMP, null, cv, - SQLiteDatabase.CONFLICT_ABORT); - if (VDBG) { - log("dbh.populateNewTable: db.insert returned >= 0; insert " - + "successful for cv " + cv); - } - } catch (SQLException e) { - if (VDBG) - log("dbh.populateNewTable insertWithOnConflict exception " + e + - " for cv " + cv); - // Insertion failed which could be due to a conflict. Check if that is - // the case and merge the entries - Cursor oldRow = DatabaseHelper.selectConflictingRow(db, - CARRIERS_TABLE_TMP, cv); - if (oldRow != null) { - ContentValues mergedValues = new ContentValues(); - mergeFieldsAndUpdateDb(db, CARRIERS_TABLE_TMP, oldRow, cv, - mergedValues, true, mContext); - oldRow.close(); - } + break; } } - } - c.close(); - } - } - - private boolean rowPersistedAfterUpgrade(Cursor c, int oldVersion) { - if (c != null) { - if (oldVersion == 14) { - String user_edited = c.getString(c.getColumnIndex("user_edited")); - if (!TextUtils.isEmpty(user_edited) && - Integer.parseInt(user_edited) != Telephony.Carriers.UNEDITED) { - return true; - } - } else { // coming from an older version - String[] persistApnsForPlmns = mContext.getResources().getStringArray( - R.array.persist_apns_for_plmn); - String plmn = c.getString(c.getColumnIndex(Telephony.Carriers.NUMERIC)); - if (!TextUtils.isEmpty(plmn)) { - for (String s : persistApnsForPlmns) { - if (plmn.equals(s) && - TextUtils.isEmpty(c.getString(c.getColumnIndex( - Telephony.Carriers.MVNO_TYPE)))) { - return true; - } + try { + db.insertWithOnConflict(CARRIERS_TABLE_TMP, null, cv, + SQLiteDatabase.CONFLICT_ABORT); + if (VDBG) { + log("dbh.copyPreservedApnsToNewTable: db.insert returned >= 0; " + + "insert successful for cv " + cv); + } + } catch (SQLException e) { + if (VDBG) + log("dbh.copyPreservedApnsToNewTable insertWithOnConflict exception " + + e + " for cv " + cv); + // Insertion failed which could be due to a conflict. Check if that is + // the case and merge the entries + Cursor oldRow = DatabaseHelper.selectConflictingRow(db, + CARRIERS_TABLE_TMP, cv); + if (oldRow != null) { + ContentValues mergedValues = new ContentValues(); + mergeFieldsAndUpdateDb(db, CARRIERS_TABLE_TMP, oldRow, cv, + mergedValues, true, mContext); + oldRow.close(); } } } } - return false; } private void getStringValueFromCursor(ContentValues cv, Cursor c, String key) { |