如何正确实现 SQLite 更新命令



我希望使用更新命令更改所有用户详细信息,具体取决于用户的电子邮件地址。我被告知使用更新命令,但我不了解如何使用更新命令,而且在线文档非常差。谁能帮我?这是我的代码:

public class DatabaseOperations extends SQLiteOpenHelper {
    public static int database_version = 1;
    public String CREATE_QUERY = "CREATE TABLE " + TableData.TableInfo.TABLE_NAME + "(" + TableData.TableInfo.USER_NAME + " TEXT," + TableData.TableInfo.USER_PASS + " TEXT," + TableData.TableInfo.USER_EMAIL + " TEXT," + TableData.TableInfo.USER_WEIGHT + " INTEGER," + TableData.TableInfo.USER_GOAL + " INTEGER );";

    public DatabaseOperations(Context context) {
        super(context, TableData.TableInfo.DATABASE_NAME, null, database_version);
        Log.d("Database Operations", "Database Created");
    }
    @Override
    public void onCreate(SQLiteDatabase sdb) {
        sdb.execSQL(CREATE_QUERY);
        Log.d("Database Operations", "Table Created");
    }
    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    }
    public void putInformation(DatabaseOperations dop, String name, String pass, String email, int weight, int goal) {
        SQLiteDatabase SQ = dop.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(TableData.TableInfo.USER_NAME, name);
        cv.put(TableData.TableInfo.USER_PASS, pass);
        cv.put(TableData.TableInfo.USER_EMAIL, email);
        cv.put(TableData.TableInfo.USER_WEIGHT, weight);
        cv.put(TableData.TableInfo.USER_GOAL, goal);
        long k = SQ.insert(TableData.TableInfo.TABLE_NAME, null, cv);
        Log.d("Database Operations", "One Row Inserted");
        SQ.close();
    }
    public Cursor getInformation(DatabaseOperations dop) {
        SQLiteDatabase SQ = dop.getReadableDatabase();
        String[] columns = {TableData.TableInfo.USER_NAME, TableData.TableInfo.USER_PASS, TableData.TableInfo.USER_EMAIL, TableData.TableInfo.USER_WEIGHT, TableData.TableInfo.USER_GOAL};
        Cursor CR = SQ.query(TableData.TableInfo.TABLE_NAME, columns, null, null, null, null, null);
        return CR;
    }
}

使用database.exeSQL("update....");

通过编辑文本或类似内容获取要更改/更新的所有数据。

在此示例中选择要更新的特定行的 ID 或名称 nombre 是一个名称:

String[] args = new String[]{nombre};//name or id whatever you want
                    db.execSQL("UPDATE " + YOUR_TABLE + " SET columnName1='" + data1 + "', columnName2='"+data2+"' WHERE nombre_column=?", args); //using SET you say that the column will be update with a new string
                    Toast.makeText(getApplicationContext(), "ALERT", Toast.LENGTH_LONG).show();

在数据库类中

public void updateRow(long rowID, String rowOne, double rowTwo, double rowThree, String rowFour )
{
    // this is a key value pair holder used by android's SQLite functions
    ContentValues values = new ContentValues();
    values.put(TABLE_ROW_ONE, rowOne);
    values.put(TABLE_ROW_TWO, rowTwo);
    values.put(TABLE_ROW_THREE, rowThree);
    values.put(TABLE_ROW_FOUR, rowFour);
    // ask the database object to update the database row of given rowID
    try {
        db.update(TABLE_NAME, values, TABLE_ROW_ID + "=" + rowID, null);}
    catch (Exception e) {
        Log.e("DB Error", e.toString());
        e.printStackTrace();
    }
}

要进行更新:

//Get an instance of the DB
//db.getInstance();
db.updateRow(rowID, rowOne, rowTwo, rowThree, rowFour);
我不知道

您是否有内容提供程序模式,但这就是我的更新函数看起来正常的方式

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    final int match = sUriMatcher.match(uri);
    final SQLiteDatabase database = mDatabase.getWritableDatabase();
    int rowsUpdated = 0;
    switch (match) {
        case USER:
            rowsUpdated = database.update(Database.Tables.USER,
                    values,
                    selection,
                    selectionArgs);
            break;
        case CONTACTLIST:
            rowsUpdated = database.update(Database.Tables.CONTACTLIST,
                    values,
                    selection,
                    selectionArgs);
            break;
....
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return rowsUpdated;
}

至于update()方法,您需要使用要更新的值创建一个 ContentValues 对象,并使用 String 数组中的电子邮件传入 whereArgs:

public void updateInformation(String name, String pass, String email, int weight, int goal) {
   SQLiteDatabase SQ = this.getWritableDatabase();
   ContentValues cv = new ContentValues();
   cv.put(TableData.TableInfo.USER_NAME, name);
   cv.put(TableData.TableInfo.USER_PASS, pass);
   cv.put(TableData.TableInfo.USER_WEIGHT,weight);
   cv.put(TableData.TableInfo.USER_GOAL,goal);
   String[] args = new String[]{email};
   SQ.update(TableData.TableInfo.TABLE_NAME, cv, TableData.TableInfo.USER_EMAIL+" = ?", args);
   SQ.close();
}

我在您的所有方法中注意到的另一件事是您传入了一个DatabaseOperations引用,因为此类已经扩展了SQLiteOpenHelper

无需在每个方法中传入dop,只需使用 this

因此,在每种方法中,而不是像此处那样使用 dop

SQLiteDatabase SQ = dop.getWritableDatabase();

您可以只引用this

SQLiteDatabase SQ = this.getWritableDatabase();

最新更新