我正在尝试检查用户输入的文本是否已经在我的数据库中,但不确定应该如何完成。
因此,我可以通过在数据库助手类中调用以下命令来从数据库中获取数据:
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"值。
退一步,从逻辑上思考问题。数据库中有哪些数据?用户正在输入什么数据?如何记录用户选择的内容,并在数据库中的数据中查找该选择?不要试图走花哨的捷径,要循序渐进。如果用户必须键入数据,您将如何搜索数据库?