Android SQL – проверьте, существует ли целая строка в базе данных

Я пытаюсь создать простое приложение-приложение, в котором вы можете сохранить свои избранные страницы (например, из Интернета).

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

Title | URL | TAG | ------------------------------- Hey Ho.com Site Jo Jo.com Image Jo Mo.com Image 

Теперь я хочу убедиться, что пользователь не добавляет одну и ту же страницу дважды, поэтому я проверю, существует ли значение. Но мне нужно, чтобы пользователь не добавлял сайт в уже добавленную таблицу.

Итак, скажем, я бы попытался добавить:

 Title | URL | TAG | ------------------------------- Jo Mo.com Image 

Это вернет true (для «проверьте, существует ли строка», потому что идентичная строка уже существует).

Но если я попытаюсь добавить:

 Title | URL | TAG | ------------------------------- Jo Go.com Image 

Он вернет false (хотя название уже существует), потому что нет одинаковой строки.

Это код, в который я добавляю свои данные в базу данных с помощью:

 public long createNote(String title, String url, String rn) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_TITLE, title); initialValues.put(KEY_URL, url); initialValues.put(KEY_RN, rn); return mDb.insert(DATABASE_TABLE, null, initialValues); 

Как проверить, существует ли строка в базе данных?

Вы можете проверить с помощью курсора:

 public boolean checkEvent(String title, String URL, String tag) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLES, new String[] { KEY_TITLE,KEY_URL,KEY_TAG }, KEY_TITLE + " = ? and "+ KEY_URL + " = ? and " + KEY_TAG + " = ?" , new String[] {title,url,tag}, null, null, null, null); if(cursor.moveToFirst()) return true; //row exists else return false; } 

Изменить: код теперь копируется и вставляется в готовом виде

Существует очень изящный (imho) способ сделать это на уровне базы данных. Добавьте это в таблицу создания sql при создании своей базы данных:

  UNIQUE(TITLE, URL) ON CONFLICT REPLACE 

Затем вы можете вставить все, что хотите, без проверки, оно будет добавлено или обновлено, если строка уже есть.

Вы можете запросить, есть ли уникальный идентификатор в базе данных, в вашем случае название может быть уникальным идентификатором строки.

 public boolean isEntry(int title){ String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_PROJECT_ID+" = "+"'"+project_id+"'"; Cursor c = db.rawQuery(queryString, null); if(c.getCount() > 0){ Log.i("CHECK", "true"); return true; } else{ return false; } } 

Здесь true означает, что существует такая строка, что false означает, что такой записи нет.

Теперь предположим, что вот-вот вставят запись в базу данных. Даже если метод возвращает true значение, что вы можете сделать, вы можете сравнить другие два значения, как в вашем примере. После этого вы можете вызвать функцию для возврата одной строки из базы данных, например

 public String getCursor(int project_id){ String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_PROJECT_ID+" = "+"'"+project_id+"'"; Cursor cursor = db.rawQuery(queryString, null); return cursor; } 

После того, как у вас есть функция, вы можете выбрать TAG и URL из нее и посмотреть, соответствует ли она таковой в вашей базе данных.

Как это:

 Cursor cursor = db.rawQuery(queryString, null); String tag = ""; String url = ""; cursor.moveToFirst(); for (int i = 0; i < cursor.getCount(); i++) { like_state = cursor.getString(cursor.getColumnIndex(KEY_TAG)); url = cursor.getString(cursor.getColumnIndex(KEY_URL)); cursor.moveToNext(); } cursor.close(); if(!ins_tag.equalsIgnoreCase(tag) || !ins_url.equalsIgnoreCase(url)) { //insert function here } 

И, как упоминалось в комментариях, вы должны использовать целое число AUTOINCREAMENT в качестве Первичного ключа.