Android SQL-检查数据库中是否已存在整行

Android SQL-检查数据库中是否已存在整行,android,database,Android,Database,我正在尝试创建一个简单的收藏夹应用程序,您可以在其中保存收藏夹页面(例如来自web) 假设我的数据库中有以下数据 Title | URL | TAG | ------------------------------- Hey Ho.com Site Jo Jo.com Image Jo Mo.com Image 现在我想确保用户不会两次添加同一页面,因此我将检查该值是否已经存在。但我需要确保用户不会向已经添加的表

我正在尝试创建一个简单的收藏夹应用程序,您可以在其中保存收藏夹页面(例如来自web)

假设我的数据库中有以下数据

Title    | URL     | TAG      |
-------------------------------
Hey       Ho.com    Site
Jo        Jo.com    Image
Jo        Mo.com    Image
现在我想确保用户不会两次添加同一页面,因此我将检查该值是否已经存在。但我需要确保用户不会向已经添加的表中添加站点

假设我想补充一点:

Title    | URL     | TAG      |
-------------------------------
Jo        Mo.com    Image
Title    | URL     | TAG      |
-------------------------------
Jo        Go.com    Image
这将返回true(用于“检查行是否存在”,因为已经存在相同的行)

但如果我想补充一点:

Title    | URL     | TAG      |
-------------------------------
Jo        Mo.com    Image
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 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;
}
一旦你有了这个功能,你可以从中选择
标签
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
}   
Cursor Cursor=db.rawQuery(queryString,null);
字符串标签=”;
字符串url=“”;
cursor.moveToFirst();
对于(int i=0;i
正如评论中提到的,您应该使用自动递增整数作为主键。

在数据库级别有一种非常优雅的(imho)方法来实现这一点。在创建数据库时,将以下内容添加到创建表sql中:

 UNIQUE(TITLE, URL) ON CONFLICT REPLACE 

然后无需检查即可插入所需内容。如果行已存在,则会添加或更新该行。

您可以使用光标进行检查:

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;

}

编辑:Code now copy&paste ready

谢谢您的回答,但我正在寻找找到相同行的方法谢谢,我将尝试让您知道如何使用
INTEGER主键自动递增
ID。请始终使用
INTEGER主键自动递增
ID。为防止重复行,您只需使用
唯一
约束。看看这个相关的答案,通过组合各种数据来创建一个唯一的标识符当然是个好主意!这是一个比已被接受的解决方案更好、更优越的解决方案。绝对值得投赞成票。谢谢:)