Android SQL-检查数据库中是否已存在整行
我正在尝试创建一个简单的收藏夹应用程序,您可以在其中保存收藏夹页面(例如来自web) 假设我的数据库中有以下数据Android SQL-检查数据库中是否已存在整行,android,database,Android,Database,我正在尝试创建一个简单的收藏夹应用程序,您可以在其中保存收藏夹页面(例如来自web) 假设我的数据库中有以下数据 Title | URL | TAG | ------------------------------- Hey Ho.com Site Jo Jo.com Image Jo Mo.com Image 现在我想确保用户不会两次添加同一页面,因此我将检查该值是否已经存在。但我需要确保用户不会向已经添加的表
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。为防止重复行,您只需使用唯一
约束。看看这个相关的答案,通过组合各种数据来创建一个唯一的标识符当然是个好主意!这是一个比已被接受的解决方案更好、更优越的解决方案。绝对值得投赞成票。谢谢:)