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

时间:2012-11-19 22:32:00

标签: android database compare

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

所以我可以通过在我的数据库帮助程序类中调用以下内容从我的数据库中获取数据:

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:邻近 “销”:语法错误:,在编译:SELECT 1 FROM damaged_components_table WHERE location_link = 3 AND成分=锁定销和位置=不适用

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

2 个答案:

答案 0 :(得分: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)为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

答案 1 :(得分:0)

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

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