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;
} 

データベースエントリごとに、2つのユーザー入力が、ユーザーが保存ボタンをクリックしたときにスピナーから取得する2つのデータベースフィールド(この場合は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:near "pin":構文エラー:、コンパイル中:SELECT 1 FROM Damaged_components_table WHERE location_link = 3 AND component = Locking pin AND position = Not Applicable

これは文字列を比較しているためだと思いますが、何か提案はありますか?

4

2 に答える 2

1

moveToFirst()1つ以上の行が存在する場合はtrueを返し、カーソルが空の場合は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
于 2012-11-19T22:42:03.983 に答える
0

よくわかりません。カーソルでデータベースからデータを取得していますが、スピナーからもカーソルIDを取得していますか?スピナーデータのソースは何ですか?getSelectedItemはAdapterViewのメソッドであり、ビューの各エントリがバッキングデータの行にバインドされていることを前提としています。getSelectedItemは、現在選択されているバインドされたビューのバッキングデータに「id」値を返します。

一歩下がって、問題について論理的に考えてください。データベースにはどのようなデータがありますか?ユーザーはどのようなデータを入力していますか?ユーザーが選択したものをどのように記録し、データベースにあるデータでその選択を探しますか?派手なショートカットをしようとしないでください、それを段階的に行ってください。ユーザーがデータを入力する必要がある場合、データベースをどのように検索しますか?

于 2012-11-19T22:49:23.277 に答える