如何检查数据是否已保存在Android数据库中



我正在尝试检查用户输入的文本是否已经在我的数据库中,但不确定应该如何完成。

因此,我可以通过在数据库助手类中调用以下命令来从数据库中获取数据:

public Cursor fetchDamagedComponentsForLocation(long damagedComponentId) {
Cursor mCursor =
rmDb.query(true, DAMAGED_COMPONENTS_TABLE, new String[] {
COMPONENT_ID, LOCATION_LINK, RUN_LINK, AREA_LINK, INSPECTION_LINK, LOCATION_REF, RACKING_SYSTEM, COMPONENT, POSITION, RISK, ACTION_REQUIRED, NOTES_GENERAL, MANUFACTURER, TEXT1, TEXT2, TEXT3, TEXT4, NOTES_SPEC}, 
LOCATION_LINK + "=" + damagedComponentId, null,
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
} 

对于每个数据库条目,我需要检查两个用户输入是否与用户单击保存按钮时从Spinners获得的两个数据库字段(在本例中为COMPONENT和POSITION)匹配:

String component = ((Cursor)componentSpinner.getSelectedItem()).getString(2).toString();
String position = ((Cursor)positionSpinner.getSelectedItem()).getString(1).toString();  

这基本上是为了确保没有保存该组件。

我相信这很简单,但我不知道怎么做。

edit-根据Sams的建议,我在数据库助手类中添加了以下类:

public boolean checkIfComponentAlreadySaved(long locationId, String component, String position) {
Cursor mCursor = rmDb.query(DAMAGED_COMPONENTS_TABLE, new String[] {"1"}, 
LOCATION_LINK + " = " + locationId + " AND " + COMPONENT + " = " + component + " AND " + POSITION + " = " + position, null, null, null, null, null);
boolean result = mCursor.moveToFirst();
mCursor.close();
return result;
}

然而,我得到了以下错误:

android.database.sqlite.SQLiteException:靠近"pin":语法错误:,编译时:SELECT 1 FROM damaged_components_table WHERE location_link=3 AND component=锁定pin AND position=不适用

我想这是因为我在比较字符串,但有什么建议吗?

如果存在一行或多行,则moveToFirst()返回true;如果Cursor为空,则返回false。所以创建一个新的方法:
public boolean isComponentDamagedForLocation(long damagedComponentId) {
Cursor mCursor =
rmDb.query(DAMAGED_COMPONENTS_TABLE, new String[] {"1"}, 
LOCATION_LINK + "=" + damagedComponentId, null,
null, null, null, null);
result = mCursor.moveToFirst();
mCursor.close();
return result;
}  

确切的列并不重要,所以您可以传递任何想要的内容,WHERE子句是这个查询的核心。使用此Java方法来测试数据是否存在。如果isComponentDamagedForLocation)为false,则插入数据。


添加
由于您在查询中使用字符串,因此应该使用替换字符(?)来防止您现在看到的错误,并保护自己免受SQL注入攻击:

public boolean checkIfComponentAlreadySaved(long locationId, String component, String position) {
Cursor mCursor = rmDb.query(DAMAGED_COMPONENTS_TABLE, new String[] {"1"}, 
LOCATION_LINK + " = " + locationId + " AND " + COMPONENT + " = ? AND " + POSITION + " = ?", 
new String[] {component, position}, null, null, null, null);
// etc

我很困惑。您在Cursor中从数据库中检索数据,但也从Spinner中获取Cursor ID?微调器数据的来源是什么?getSelectedItem是AdapterView的一个方法,它假设View中的每个条目都绑定到支持数据中的一行。getSelectedItem在当前所选绑定视图的后台数据中返回一个"id"值。

退一步,从逻辑上思考问题。数据库中有哪些数据?用户正在输入什么数据?如何记录用户选择的内容,并在数据库中的数据中查找该选择?不要试图走花哨的捷径,要循序渐进。如果用户必须键入数据,您将如何搜索数据库?

相关内容

  • 没有找到相关文章

最新更新