3

where セクションに数字をハードコードすると、期待している行が返されます

Cursor cursor = db.query( tableName, 
new String[] {colID, colString, colNumber },  
colNumber + "=14", 
null, 
null, null, null, null);

代わりに数値をパラメーターとして入力すると、行が返されません。

Cursor cursor = db.query( tableName, 
new String[] {colID, colString, colNumber },  
colNumber + "=?", 
new String[] { String.valueOf(14) }, 
null, null, null, null);

2番目のケースで何が間違っていますか?

テーブル ステートメントを作成します。

db.execSQL("CREATE TABLE "
        + otherTableName + " ("
        + otherTableID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + otherTableString + " TEXT"
        + ");");

db.execSQL("CREATE TABLE "
        + tableName + " ("
        + colID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + colString + " TEXT, "
        + colNumber + " REFERENCES "
        + otherTableName + "(" + otherTableID
            + "));");
4

1 に答える 1

1

問題は、2 番目の DML ステートメント、より正確な外部キーの宣言だと思います。私はそれがあるべきだと思います:

db.execSQL("CREATE TABLE "
        + tableName + " ("
        + colID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + colString + " TEXT, "
        + colNumber + " INTEGER, "
        + " FOREIGN KEY (" + colNumber + ") REFERENCES "
        + otherTableName + "(" + otherTableID
            + "));");

それが機能しない他の理由を説明することはできません。あなたのステートメントは、ハードコア値と2番目のプレースホルダーを使用することを除いて同じです。おそらく、FK を誤って宣言したと思われる tableName テーブルでパラメーター化されたステートメントを試しましたが、これが行を取得した理由です。

プレースホルダーはSQLite の型親和性に基づいて機能します

列を として定義した場合TEXT、プレースホルダーは置き換えられ、値は として比較されcol = 'value'ます。列を として定義した場合INTEGER、プレースホルダーは置き換えられ、値は として比較されcol = valueます。しかし、2 番目の DML ステートメントでは、列のデータ型を指定しておらず、どこかの列を参照しているだけです。

于 2013-04-02T16:29:40.470 に答える