0

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

所以我可以通过在我的数据库助手类中调用以下命令从我的数据库中获取数据:

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

这基本上是为了确保尚未保存该组件。

我敢肯定这很简单,但我不知道该怎么做..

编辑 - 按照 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”:语法错误:,编译时:从损坏的组件表中选择 1 WHERE location_link = 3 AND component = Locking pin AND position = Not Applicable

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

4

2 回答 2

1

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)为假,则插入数据。


添加
由于您在查询中使用字符串,因此您应该使用替换字符 ( ?) 来防止您现在看到的错误并保护自己免受 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
于 2012-11-19T22:42:03.983 回答
0

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

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

于 2012-11-19T22:49:23.277 回答