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

时间:2013-12-19 16:42:06

标签: android database

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

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

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);

如何检查数据库中是否已存在行?

3 个答案:

答案 0 :(得分:7)

您可以使用光标检查:

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;

}

编辑:代码现在复制&准备就绪

答案 1 :(得分:5)

在数据库级别有一种非常优雅(imho)的方法。在创建数据库时将其添加到create table sql:

 UNIQUE(TITLE, URL) ON CONFLICT REPLACE 

然后你可以插入所有你想要的而不用检查,如果行已经存在,它将被添加或更新。

答案 2 :(得分:1)

您可以查询数据库中是否有唯一标识符,在您的情况下,标题可能是该行的唯一标识符。

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;
}

获得此功能后,您可以从中选择TAGURL,看看它是否与数据库中的匹配。

像这样:

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整数作为主键。

相关问题