У меня есть вопрос для моего задания. У меня есть база данных с sqlite в моем приложении для Android, и обновления местоположения приходят и записывают в базу данных sql, но есть и те же данные с предстоящими обновлениями. Я хочу проверить, есть ли такое же местоположение в моей БД, система пропускает или перезаписывает существующую информацию о местоположении в БД как x, y У меня есть некоторый код, который я публикую ниже, но мой код всегда добавляет или всегда перезаписывает, если я изменяю его как Обновление Заменить или что-то в этом роде, у меня есть идентификатор в моих базах данных.
Как изменить и организовать мой код для работы?
public void DBCreate(){
SQLITEDATABASE = openOrCreateDatabase("LatLongDatabase3", Context.MODE_PRIVATE, null);
SQLITEDATABASE.execSQL("CREATE TABLE IF NOT EXISTS myTable74(id INTEGER PRIMARY KEY AUTOINCREMENT, FAVCurrentLocationLAT VARCHAR,FAVCurrentLocationLONG VARCHAR);");
}
public void SubmitData2SQLiteDB(){
SQLiteQuery = "INSERT OR REPLACE INTO myTable74(id, FAVCurrentLocationLAT, FAVCurrentLocationLONG) VALUES(NULL,'"+mCurrentLocation.getLatitude()+"','"+mCurrentLocation.getLongitude()+"');";
SQLITEDATABASE.execSQL(SQLiteQuery);
Toast.makeText(CampaignActivity.this,"OK", Toast.LENGTH_LONG).show();
}
Вы не используете INSERT OR REPLACE
как вы должны.
Что делает INSERT OR REPLACE
или просто REPLACE
:
Проверяет перед вставкой новой строки, если эта строка будет нарушать ограничение и
-if он нарушает ограничение, он удаляет существующую строку и затем вставляет новую строку
-if это не нарушает ограничение, затем продолжается и вставляет новую строку
В вашей таблице единственное существующее ограничение:
id INTEGER PRIMARY KEY
и ничего больше.
Это означает, что каждый раз, когда вы пытаетесь вставить новую строку:
-if новый id
уже существует в таблице, затем эта существующая строка будет удалена, а новая строка будет вставлена
-if новый id
еще не существует, тогда будет вставлена новая строка.
Это то, что вы хотите?
Я думаю, что вы хотите, это ограничение на уникальности 2 столбцов (FAVCurrentLocationLAT,FAVCurrentLocationLONG)
который должен быть PRIMARY KEY
в таблице, так как я не думаю, что id
нужен (или, может быть, это необходимо, но это не причина неудачной вставки).
Поэтому измените оператор CREATE
таблицы следующим образом:
CREATE TABLE myTable74 (
FAVCurrentLocationLAT TEXT,
FAVCurrentLocationLONG TEXT,
PRIMARY KEY(FAVCurrentLocationLAT,FAVCurrentLocationLONG)
);
Теперь каждый раз, когда вы выполняете утверждение:
SQLiteQuery =
"INSERT OR REPLACE INTO myTable74(FAVCurrentLocationLAT, FAVCurrentLocationLONG) " +
"VALUES('"+mCurrentLocation.getLatitude()+"','"+mCurrentLocation.getLongitude()+"');";
новые пары значений будут вставлены, а существующие будут заменены.
Замена, конечно, не нужна, поэтому вы можете просто проверить по коду, есть ли значения в таблице, и если они действительно не выполняются, вместо выполнения оператора INSERT
(вместо REPLACE
).
INSERT INTO myTable74(id, FAVCurrentLocationLAT, FAVCurrentLocationLONG)
VALUES(NULL,'"+mCurrentLocation.getLatitude()+"','"+mCurrentLocation.getLongitude()+"')
WHERE NOT EXISTS(SELECT id FROM myTable74 WHERE id = your_id);
Но Insert or Replace
и IF not exists
, не идут вместе, вы не можете заменить то, что не существует. Так что выше просто Insert
И, конечно, вы можете изменить id
по которому когда-либо столбец вы хотите проверить, существует ли он
id
. Хотите проверить, существует ли элемент в БД по id, широте или долготе?
Я сделал проблему с помощью @porpas. Спасибо, сэр. Теперь я хочу сделать тот же метод для названий и дат моей кампании, я перепробовал все тексты, VARCHAR, REAL ETC. Но выдает какую-то ошибку, может кто-нибудь, пожалуйста, помогите мне?
Ошибка:
android.database.sqlite.SQLiteException: near "REAL": syntax error (code 1): , while compiling: INSERT OR REPLACE INTO myTable2(FAVCampaignName REAL, FAVCampaigncampaignStartDate REAL, FAVCampaigncampaignEndDate REAL) VALUES('TEST_LOC_ME','2019-04-01','2020-01-15');
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(near "REAL": syntax error (code 1): , while compiling: INSERT OR REPLACE INTO myTable2(FAVCampaignName REAL, FAVCampaigncampaignStartDate REAL, FAVCampaigncampaignEndDate REAL) VALUES('TEST_LOC_ME','2019-04-01','2020-01-15');)
КОД 1:
public void DBCreateFavCampaign(){
SQLITEDATABASEFavCampaign = openOrCreateDatabase("FavCampaign4", Context.MODE_PRIVATE, null);
SQLITEDATABASEFavCampaign.execSQL("CREATE TABLE IF NOT EXISTS myTable2(FAVCampaignName REAL,FAVCampaigncampaignStartDate REAL, FAVCampaigncampaignEndDate REAL, PRIMARY KEY (FAVCampaignName,FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate));");
}
Код 2:
SQLiteQueryFavCampaign = "INSERT OR REPLACE INTO myTable2(FAVCampaignName REAL, FAVCampaigncampaignStartDate REAL, FAVCampaigncampaignEndDate REAL)" + " VALUES('"+FSname+"','"+FScampaignStartDate+"','"+FScampaignEndDate+"');";
SQLITEDATABASEFavCampaign.execSQL(SQLiteQueryFavCampaign);
Проблема с Replace заключается в том, что если запись существует, она удалит эту запись вместе со значением первичного ключа, а затем вставит новую запись с новым значением первичного ключа. Если у вас есть другие таблицы, которые ссылаются на это старое значение первичного ключа, это может быть проблемой. Что вы действительно хотите сделать, это проверить, есть ли значения для определенного широты/долготы уже в базе данных, и если это так, оставьте их в покое (не удаляйте, а затем вставьте заново). Но если нет, то просто сделайте простую вставку. Итак, взяв на себя инициативу предыдущего поста, я бы немного изменил его так:
// Don't include ID in the INSERT as primary key should be auto-incrementing field
INSERT INTO myTable74(FAVCurrentLocationLAT, FAVCurrentLocationLONG) VALUES(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude())
WHERE NOT EXISTS(SELECT id FROM myTable74 WHERE FAVCurrentLocationLAT = mCurrentLocation.getLatitude() AND FAVCurrentLocationLONG= mCurrentLocation.getLongitude());
VARCHAR
. Вы можете заменить его наINTEGER
илиREAL
если значения содержат десятичные разряды.