如何更新数据库?

如何更新数据库?

问题描述:

在我的应用程序中我有一个数据库。虽然我可以成功插入表中,但我在更新字段时遇到问题。如何更新数据库?

此代码创建我的表:

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) 

任何意见或建议,将不胜感激。

字符串文字必须用单引号引起来。

例如:

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

记住,你和认证是列名。

+0

感谢,对附近有两个小时,我害了自己找到问题。谢谢 – Hesam 2012-08-07 08:41:56

+0

如果它解决了您的问题,请不要忘记标记为答案! @Hesam – JoxTraex 2012-08-07 08:43:40

+0

是的,我记得但我需要等10分钟,然后接受它。 :) – Hesam 2012-08-07 09:06:27

更换

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

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

要:

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

这是使用SQL语句与参数的推荐方式(使用?

+0

什么“?”意思? – Hesam 2012-08-07 09:03:54

+0

这些是android中的sqlite查询参数的注入器。通过在您的查询中添加**?**,框架将自动处理单引号问题,因此您不必手动完成这项工作。它的安全! :) – waqaslam 2012-08-07 09:06:50