SQLite, если вход существует в базе данных, пропустить или перезаписать существующий - PullRequest
1 голос
/ 26 апреля 2019

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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Вы не используете INSERT OR REPLACE, как следует.INSERT OR REPLACE или просто REPLACE делает:Проверяет перед вставкой новой строки, если эта строка будет нарушать ограничение и-if нарушает ограничение , удаляет существующую строку, а затем вставляет новую строку-if это не нарушает ограничение , затем продолжается и вставляет новую строкуВ вашей таблице единственное существующее ограничение:

id INTEGER PRIMARY KEY

и ничего больше.Это означает, что каждый раз, когда вы пытаетесь вставить новую строку:-Если новый id уже существует в таблице, тогда эта существующая строка будет удалена, а новая строка будет вставлена-Если новый id еще не существует , то будет вставлен новый ряд.Это то, что вы хотите?Я думаю, что вы хотите ограничить уникальность двух столбцов (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).

2 голосов
/ 26 апреля 2019
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 голосов
/ 26 апреля 2019

Проблема с заменой заключается в том, что если запись существует, она удалит эту запись вместе со значением первичного ключа, а затем вставит новую запись с новым значением первичного ключа. Если у вас есть другие таблицы, которые ссылаются на это старое значение первичного ключа, это может быть проблемой. Что вы действительно хотите сделать, это проверить, есть ли значения для определенного широты / долготы уже в базе данных, и если это так, оставьте их в покое (не удаляйте, а затем вставьте заново). Но если нет, то просто сделайте простую вставку. Итак, взяв на себя инициативу предыдущего поста, я бы немного изменил его так:

// 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...