0

私のアプリケーションにはデータベースがあります。テーブルに正常に挿入できますが、フィールドの更新に問題があります。

このコードは私のテーブルを作成します:

public final static String[] TABLES_NAME = {"general", "toprecipes", "favorites", "shoppinglist"};
//-- Columns of table: shopping list
    public final static String[] CLM_SHOPPINGLIST = {COLUMN_ID, "resepiId", "resepiName", "ingredient", "status"};
    private final String CRT_TBL_SHOPPINGLIST = "CREATE TABLE " + TABLES_NAME[3] + " (" + 
        CLM_SHOPPINGLIST[0] + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
        CLM_SHOPPINGLIST[1] + " TEXT," + 
        CLM_SHOPPINGLIST[2] + " TEXT," + 
        CLM_SHOPPINGLIST[3] + " TEXT," + 
        CLM_SHOPPINGLIST[4] + " TEXT"  + 
        ");";

イベントに基づいて、アイテムのステータスを「T」から「F」に、またはその逆に設定する必要があります。

データベースを更新するために、次のコードがあります。

public void updateRecordStatus(String resepiName, String ingredientName, String status) {
        ContentValues cv = new ContentValues();
        cv.put(DatabaseHelper.CLM_SHOPPINGLIST[4], status);

        database.update(DatabaseHelper.TABLES_NAME[3], cv, DatabaseHelper.CLM_SHOPPINGLIST[2] + "=" + resepiName + " AND " + DatabaseHelper.CLM_SHOPPINGLIST[3] + "=" + ingredientName, null);

        Log.i(TAG, "Status of ingredient '" + ingredientName + "' updated to '" + status + "' in table.");
    }

すべて問題ないように見えますが、その理由がわかりません。アプリを実行して更新しようとすると、クラッシュします。Logcat は、これらのメッセージとポイントを示しますdatabase.update(...)

08-07 08:08:03.289: I/Database(460): sqlite returned: error code = 1, msg = near "Bakar": syntax error
08-07 08:08:03.289: E/Database(460): Error updating status=T using UPDATE shoppinglist SET status=? WHERE resepiName=Terung Bakar Mediterrinean AND ingredient=2 biji lemon
08-07 08:08:03.289: W/dalvikvm(460): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-07 08:08:03.323: E/AndroidRuntime(460): FATAL EXCEPTION: main
08-07 08:08:03.323: E/AndroidRuntime(460): android.database.sqlite.SQLiteException: near "Bakar": syntax error: , while compiling: UPDATE shoppinglist SET status=? WHERE resepiName=Terung Bakar Mediterrinean AND ingredient=2 biji lemon
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1671)
08-07 08:08:03.323: E/AndroidRuntime(460):  at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1622)
08-07 08:08:03.323: E/AndroidRuntime(460):  at com.astro.recipe.database.DBShoppingListHandler.updateRecordStatus(DBShoppingListHandler.java:107)
08-07 08:08:03.323: E/AndroidRuntime(460):  at com.astro.recipe.activities.ShoppingList$2.OnCheckChangedListener(ShoppingList.java:90)

コメントや提案をいただければ幸いです。

4

4 に答える 4

1

交換

 database.update(DatabaseHelper.TABLES_NAME[3], cv, DatabaseHelper.CLM_SHOPPINGLIST[2] + "=" + resepiName + " AND " + DatabaseHelper.CLM_SHOPPINGLIST[3] + "=" + ingredientName, null);

 database.update(DatabaseHelper.TABLES_NAME[3], cv, DatabaseHelper.CLM_SHOPPINGLIST[2] + "= '" + resepiName + "' AND " + DatabaseHelper.CLM_SHOPPINGLIST[3] + "='" + ingredientName + "'", null);
于 2012-08-07T08:39:13.247 に答える
1
database.update(DatabaseHelper.TABLES_NAME[3], cv, DatabaseHelper.CLM_SHOPPINGLIST[2] + "='" + resepiName + "' AND " + DatabaseHelper.CLM_SHOPPINGLIST[3] + "='" + ingredientName+"'", null);

上記をお試しください

文字列を一重引用符で囲みます。

于 2012-08-07T08:39:23.560 に答える
1

変化する:

database.update(DatabaseHelper.TABLES_NAME[3], cv,
    DatabaseHelper.CLM_SHOPPINGLIST[2] + "=" + resepiName + " AND " +
    DatabaseHelper.CLM_SHOPPINGLIST[3] + "=" + ingredientName, null);

に:

database.update(DatabaseHelper.TABLES_NAME[3], cv,
   DatabaseHelper.CLM_SHOPPINGLIST[2] + " = ?" +
   " AND " + DatabaseHelper.CLM_SHOPPINGLIST[3] + " = ?",
   new String[]{resepiName, ingredientName});

これは、パラメーターを指定して SQL ステートメントを使用する場合に推奨される方法です ( を使用?) 。

于 2012-08-07T08:43:42.257 に答える
1

文字列リテラルは一重引用符で囲む必要があります。

例えば:

Where you='jox' AND authenticated='1'

you と authenticated は列名であることに注意してください。

于 2012-08-07T08:38:04.497 に答える