Некоторые вопросы
В вашем коде есть несколько посторонних пробелов, таких как: -
String.value Of(home_id)
db.insert With On Conflict
Для возникновения конфликта должно быть указано ограничение (неявно или явно). Совсем не ясно, что вы определили подходящие ограничения или даже какие они должны быть. ( пример ниже предполагает ограничения )
Если в TABLE_MAP_MARKER не будет строки для обновления, тогда marker_id_table
будет равно 0. Таким образом, при условии успешной вставки в TABLE_MAP_MARKER будет использоваться 0 для столбца HOME_ID для попытки обновления TABLE_MAP_MARKER_INFO (при условии стандартного использование столбца идентификатора и определение его как INTEGER PRIMARY KEY (с или без AUTOINCREMENT)) тогда идентификатор 0 не будет существовать, поэтому никакая строка не может быть обновлена. Однако затем можно вставить строку с HOME_ID, равным 0, и тогда HOME_ID будет не синхронизирован между двумя таблицами. Исправление, использованное в этом примере, заключалось в использовании значения HOME_ID для столбца _id (т.е. столбец HOME_ID ) в обновлении / вставке TABLE_MAP_MARKER_INFO.
Рабочий пример: -
Следующее основано на УНИКАЛЬНЫХ ограничениях: -
- Для таблицы MAP MARKER комбинация широты и долготы должна быть УНИКАЛЬНОЙ
- Для таблицы MAP MARKER INFO комбинация типа дома и арендной платы должна быть УНИКАЛЬНОЙ (маловероятно, но что еще будет).
Тогда таблицы могут быть созданы с использованием эквивалента: -
CREATE TABLE IF NOT EXISTS map_marker(_id INTEGER PRIMARY KEY,map_marker_lat INTEGER,map_marker_lng INTEGER, UNIQUE(map_marker_lat,map_marker_lng));
CREATE TABLE IF NOT EXISTS map_marker_info(_id INTEGER PRIMARY KEY,home_type TEXT,amount_rent REAL, UNIQUE(HOME_TYPE,AMOUNT_RENT));
Таким образом, явное уникальное ограничение помещается в map_marker_lat map_marker вместе со столбцом map_marker_lng. Таким образом, оба значения в комбинации должны быть уникальными, иначе возникает конфликт. Поэтому 100 110 вместе с 100 120 были бы хороши, но вторая 100 110 приведет к конфликту.
Кроме того, из-за PRIMARY KEY столбец _id имеет неявное уникальное ограничение (так как это INTEGER PRIMARY KEY, тогда он также должен быть целочисленным значением).
То есть с классом DatabaseHelper (предположите, что у вас может быть, включая метод addMarkerAndMarkerInfo , основанный на вашем коде (исправления применены и добавлен вход в систему - см. Комментарии / закомментированные строки)): -
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "marker";
public static final int DBVERSION = 1;
public static final String TABLE_MAP_MARKER = "map_marker";
public static final String TABLE_MAP_MARKER_INFO = "map_marker_info";
public static final String HOME_ID = BaseColumns._ID;
public static final String KEY_MARKER_LAT = "map_marker_lat";
public static final String KEY_MARKER_LNG = "map_marker_lng";
public static final String HOME_TYPE = "home_type";
public static final String AMOUNT_RENT = "amount_rent";
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String crtmm = "CREATE TABLE IF NOT EXISTS " + TABLE_MAP_MARKER + "(" +
HOME_ID + " INTEGER PRIMARY KEY, " +
KEY_MARKER_LAT + " INTEGER, " +
KEY_MARKER_LNG + " INTEGER, " +
" UNIQUE(" +
KEY_MARKER_LAT + "," +
KEY_MARKER_LNG +
")" +
")";
String crtmmi = "CREATE TABLE IF NOT EXISTS " + TABLE_MAP_MARKER_INFO + "(" +
HOME_ID + " INTEGER PRIMARY KEY, " +
HOME_TYPE + " TEXT," +
AMOUNT_RENT + " REAL," +
" UNIQUE(" +
HOME_TYPE + ", " +
AMOUNT_RENT +
")" +
")";
db.execSQL(crtmm);
db.execSQL(crtmmi);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public void addMarkerAndMarkerInfo(long home_id,int map_marker_lat_value, int map_marker_long_value, String home_type, double amount_rent, String attempt) {
String TAG = "AMAMI-" + attempt;
SQLiteDatabase db = this.getWritableDatabase();
ContentValues marker_position_values= new ContentValues();
marker_position_values.put(KEY_MARKER_LAT, map_marker_lat_value);
marker_position_values.put(KEY_MARKER_LNG, map_marker_long_value);
Log.d(TAG,"Attempting Update of MAP MARKER TABLE.");
long marker_id_table = db.update(TABLE_MAP_MARKER, marker_position_values, HOME_ID + " = ?", new String[]{String.valueOf(home_id)});
if (marker_id_table == 0) {
Log.d(TAG,String.valueOf(marker_id_table) + " rows Updated for MAP MARKER TABLE, attempting insert");
//long insertid = db.insertWithOnConflict(TABLE_MAP_MARKER, null, marker_position_values, SQLiteDatabase.CONFLICT_REPLACE);
long insertid = db.insertWithOnConflict(TABLE_MAP_MARKER, null, marker_position_values, SQLiteDatabase.CONFLICT_IGNORE);
//long insertid = db.insert(TABLE_MAP_MARKER, null, marker_position_values); //<<<< used to check what conflicts occur
if (insertid < 0) {
Log.d(TAG,"No row inserted into MAP MARKER TABLE.");
} else {
Log.d(TAG,"Row inserted into MAP MARKER TABLE.");
}
} else {
Log.d(TAG,"Update of MARKER TABLE Successful (" + String.valueOf(marker_id_table) + " rows updated.)");
}
ContentValues unit_values= new ContentValues();
//unit_values.put(HOME_ID, marker_id_table); ????????
unit_values.put(HOME_ID,home_id);
unit_values.put(HOME_TYPE, home_type);
unit_values.put(AMOUNT_RENT, amount_rent);
Log.d(TAG,"Attempting Update of MAP MARKER INFO TABLE.");
long unit_id_table = db.update(TABLE_MAP_MARKER_INFO, unit_values, HOME_ID + " = ?", new String[]{String.valueOf(home_id)});
if (unit_id_table == 0) {
Log.d(TAG,String.valueOf(unit_id_table) + " rows Updated for MAP MARKER INFO TABLE, attempting insert");
long insertid = db.insertWithOnConflict(TABLE_MAP_MARKER_INFO, null, unit_values, SQLiteDatabase.CONFLICT_IGNORE);
//long insertid = db.insertWithOnConflict(TABLE_MAP_MARKER_INFO, null, unit_values, SQLiteDatabase.CONFLICT_REPLACE);
//long insertid = db.insert(TABLE_MAP_MARKER_INFO, null, unit_values); //<<<< used to check what conflicts occur
if (insertid < 0) {
Log.d(TAG,"No row inserted into MAP MARKER INFO TABLE");
} else {
Log.d(TAG,"Row inserted into MAP MARKER INFO TABLE.");
}
} else {
Log.d(TAG,"Update of MARKER INFO TABLE Successful (" + String.valueOf(unit_id_table) + " rows updated.)");
}
}
}
- Примечание. CONFLICT_REPLACE заменено на CONFLICT_IGNORE (действительно заменить дубликат?)
Результаты
Затем вызовите вышеуказанное с помощью (удаляет все существующие строки и пытается добавить 4 строки): -
DatabaseHelper mDBHlp = new DatabaseHelper(this);
mDBHlp.getWritableDatabase().delete(DatabaseHelper.TABLE_MAP_MARKER,null,null);
mDBHlp.getWritableDatabase().delete(DatabaseHelper.TABLE_MAP_MARKER_INFO,null,null);
mDBHlp.addMarkerAndMarkerInfo(1,100,100,"House",45.64,"Attempt 1");
mDBHlp.addMarkerAndMarkerInfo(2,150,150,"House",65.64,"Attempt 2");
// Duplicate
mDBHlp.addMarkerAndMarkerInfo(3,100,100,"House",45.64,"Attempt 3");
// Another duplicate
mDBHlp.addMarkerAndMarkerInfo(1,100,100,"House",45.64,"Attempt 4");
Результат: -
09-04 22:47:16.459 1917-1917/? D/AMAMI-Attempt 1: Attempting Update of MAP MARKER TABLE.
0 rows Updated for MAP MARKER TABLE, attempting insert
09-04 22:47:16.463 1917-1917/? D/AMAMI-Attempt 1: Row inserted into MAP MARKER TABLE.
Attempting Update of MAP MARKER INFO TABLE.
0 rows Updated for MAP MARKER INFO TABLE, attempting insert
09-04 22:47:16.467 1917-1917/? D/AMAMI-Attempt 1: Row inserted into MAP MARKER INFO TABLE.
09-04 22:47:16.467 1917-1917/? D/AMAMI-Attempt 2: Attempting Update of MAP MARKER TABLE.
0 rows Updated for MAP MARKER TABLE, attempting insert
09-04 22:47:16.471 1917-1917/? D/AMAMI-Attempt 2: Row inserted into MAP MARKER TABLE.
Attempting Update of MAP MARKER INFO TABLE.
0 rows Updated for MAP MARKER INFO TABLE, attempting insert
09-04 22:47:16.475 1917-1917/? D/AMAMI-Attempt 2: Row inserted into MAP MARKER INFO TABLE.
09-04 22:47:16.475 1917-1917/? D/AMAMI-Attempt 3: Attempting Update of MAP MARKER TABLE.
0 rows Updated for MAP MARKER TABLE, attempting insert
No row inserted into MAP MARKER TABLE.
Attempting Update of MAP MARKER INFO TABLE.
0 rows Updated for MAP MARKER INFO TABLE, attempting insert
No row inserted into MAP MARKER INFO TABLE
09-04 22:47:16.475 1917-1917/? D/AMAMI-Attempt 4: Attempting Update of MAP MARKER TABLE.
09-04 22:47:16.479 1917-1917/? D/AMAMI-Attempt 4: Update of MARKER TABLE Successful (1 rows updated.)
Attempting Update of MAP MARKER INFO TABLE.
09-04 22:47:16.483 1917-1917/? D/AMAMI-Attempt 4: Update of MARKER INFO TABLE Successful (1 rows updated.)
т.е.
- 1 и 2 добавили строки как ничего для обновления.
- 3 ничего не сделал, так как без идентификатора 3, кроме дублированных данных.
- 4 обновил строки, как они существуют.
Дополнительный выпуск
Также может показаться, что в этих двух таблицах нет необходимости, поскольку между этими двумя таблицами, похоже, существует соотношение 1-1. Поэтому может быть так, что в одной таблице могут быть все столбцы (широта, долгота, тип и рента).
Дополнительный
Добавление метода logAllRows
(как указано ниже) и вызов его в конце каждого обновления / вставки. Позволяет увидеть фактические данные.
private void logAllRows(String tablename, String TAG) {
SQLiteDatabase db = this.getWritableDatabase();
StringBuilder sb = new StringBuilder();
Cursor csr = db.query(tablename,null,null,null,null,null,null);
while (csr.moveToNext()) {
sb.append("\nRow # = ").append(String.valueOf(csr.getPosition() + 1));
for (int i=0; i < csr.getColumnCount(); i++) {
sb.append("\n\tColumn is ").append(csr.getColumnName(i)).append(" Value is ");
int columntype = csr.getType(i);
switch (columntype) {
case Cursor.FIELD_TYPE_NULL:
sb.append("NULL");
break;
case Cursor.FIELD_TYPE_FLOAT:
sb.append(String.valueOf(csr.getDouble(i)));
break;
case Cursor.FIELD_TYPE_INTEGER:
sb.append(String.valueOf(csr.getInt(i)));
break;
case Cursor.FIELD_TYPE_STRING:
sb.append(csr.getString(i));
break;
case Cursor.FIELD_TYPE_BLOB:
sb.append("BLOB");
break;
}
}
}
csr.close();
Log.d(TAG,sb.toString());
}
Результаты при использовании logAllRows
09-05 02:49:56.875 3016-3016/? D/AMAMI-Attempt 1: Attempting Update of MAP MARKER TABLE.
09-05 02:49:56.879 3016-3016/? D/AMAMI-Attempt 1: 0 rows Updated for MAP MARKER TABLE, attempting insert
Row inserted into MAP MARKER TABLE. ID = 1
Table is map_marker Row # = 1
Column is _id Value is 1
Column is map_marker_lat Value is 100
Column is map_marker_lng Value is 100
Attempting Update of MAP MARKER INFO TABLE.
0 rows Updated for MAP MARKER INFO TABLE, attempting insert
09-05 02:49:56.887 3016-3016/? D/AMAMI-Attempt 1: Row inserted into MAP MARKER INFO TABLE. ID = 1
Table is map_marker_info Row # = 1
Column is _id Value is 1
Column is home_type Value is House
Column is amount_rent Value is 45.64
09-05 02:49:56.887 3016-3016/? D/AMAMI-Attempt 2: Attempting Update of MAP MARKER TABLE.
0 rows Updated for MAP MARKER TABLE, attempting insert
09-05 02:49:56.903 3016-3016/? D/AMAMI-Attempt 2: Row inserted into MAP MARKER TABLE. ID = 2
Table is map_marker Row # = 1
Column is _id Value is 1
Column is map_marker_lat Value is 100
Column is map_marker_lng Value is 100
Table is map_marker Row # = 2
Column is _id Value is 2
Column is map_marker_lat Value is 150
Column is map_marker_lng Value is 150
Attempting Update of MAP MARKER INFO TABLE.
0 rows Updated for MAP MARKER INFO TABLE, attempting insert
09-05 02:49:56.907 3016-3016/? D/AMAMI-Attempt 2: Row inserted into MAP MARKER INFO TABLE. ID = 2
Table is map_marker_info Row # = 1
Column is _id Value is 1
Column is home_type Value is House
Column is amount_rent Value is 45.64
Table is map_marker_info Row # = 2
Column is _id Value is 2
Column is home_type Value is House
Column is amount_rent Value is 65.64
09-05 02:49:56.907 3016-3016/? D/AMAMI-Attempt 3: Attempting Update of MAP MARKER TABLE.
0 rows Updated for MAP MARKER TABLE, attempting insert
No row inserted into MAP MARKER TABLE.
Table is map_marker Row # = 1
Column is _id Value is 1
Column is map_marker_lat Value is 100
Column is map_marker_lng Value is 100
Table is map_marker Row # = 2
Column is _id Value is 2
Column is map_marker_lat Value is 150
Column is map_marker_lng Value is 150
Attempting Update of MAP MARKER INFO TABLE.
09-05 02:49:56.911 3016-3016/? D/AMAMI-Attempt 3: 0 rows Updated for MAP MARKER INFO TABLE, attempting insert
No row inserted into MAP MARKER INFO TABLE
Table is map_marker_info Row # = 1
Column is _id Value is 1
Column is home_type Value is House
Column is amount_rent Value is 45.64
Table is map_marker_info Row # = 2
Column is _id Value is 2
Column is home_type Value is House
Column is amount_rent Value is 65.64
09-05 02:49:56.911 3016-3016/? D/AMAMI-Attempt 4: Attempting Update of MAP MARKER TABLE.
09-05 02:49:56.915 3016-3016/? D/AMAMI-Attempt 4: Update of MARKER TABLE Successful (1 rows updated.)
Table is map_marker Row # = 1
Column is _id Value is 1
Column is map_marker_lat Value is 100
Column is map_marker_lng Value is 100
Table is map_marker Row # = 2
Column is _id Value is 2
Column is map_marker_lat Value is 150
Column is map_marker_lng Value is 150
Attempting Update of MAP MARKER INFO TABLE.
09-05 02:49:56.919 3016-3016/? D/AMAMI-Attempt 4: Update of MARKER INFO TABLE Successful (1 rows updated.)
Table is map_marker_info Row # = 1
Column is _id Value is 1
Column is home_type Value is House
Column is amount_rent Value is 45.64
Table is map_marker_info Row # = 2
Column is _id Value is 2
Column is home_type Value is House
Column is amount_rent Value is 65.64