SQLite, если вход существует в базе данных, пропустить или перезаписать существующий

1

У меня есть вопрос для моего задания. У меня есть база данных с 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();
}
Теги:

4 ответа

2
Лучший ответ

Вы не используете 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).

  • 0
    Сэр, спасибо за ваш ответ, да! Вы правы, это кажется хорошим решением, которое я сейчас пытаюсь, я должен назвать их текст, потому что я должен сделать некоторые вычисления после того, как они написали в БД.
  • 2
    Причина, по которой у меня в тексте TEXT, заключается в том, что в вашем коде есть VARCHAR . Вы можете заменить его на INTEGER или REAL если значения содержат десятичные разряды.
Показать ещё 13 комментариев
2
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 по которому когда-либо столбец вы хотите проверить, существует ли он

  • 0
    Спасибо, сэр, что мне нужно написать в "your_id", могу ли я скопировать код и использовать его lite, это делает код автоматически выполняющим работу для каждого обновления
  • 2
    Замените его своим id . Хотите проверить, существует ли элемент в БД по id, широте или долготе?
Показать ещё 2 комментария
0

Я сделал проблему с помощью @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);
0

Проблема с 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());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню