Android SQLite: declaración de actualización

91

Necesito implementar SQLite en mi aplicación. Seguí este tutorial .. Creando y usando bases de datos en Android One

Todo está funcionando bien. Inserté 1 fila con 5 columnas. Ahora solo quiero actualizar el valor de 1 columna y otras seguirán siendo las mismas.

Hay un método de actualización en el tutorial, pero necesita todos los parámetros, sin embargo, quiero actualizar solo una columna.

vivek_Android
fuente
La URL solicitada /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one no se encontró en este servidor.
Machado

Respuestas:

165

Puede utilizar el siguiente código.

String strFilter = "_id=" + Id;
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
myDB.update("titles", args, strFilter, null);
Nikhil
fuente
13
Incluso podría hacer: myDB.update ("títulos", argumentos, strFilter, new String [] {Integer.toString (ID)}); si tiene strFilter establecido en "_id =?" ... Lo molesto con un solo elemento es que todavía necesita ponerlo en una matriz, lo que puede hacerlo inconveniente. Aún así, votó a favor de la respuesta correcta.
Joshhendo
4
@Dheeraj - Esto solo actualizará la columna que se agrega al objeto
ContentValues
2
Si no me equivoco, el código de @joshhendo también debería evitar las inyecciones de SQL, algo que esta respuesta no considera. Dado que el argumento se pasa como parámetro, el código subyacente lo escapa.
r41n
Debería poner comillas alrededor de su Id. Algo como:String strFilter = "_id='" + Id + "'";
Guillaume
119

Puedes probar:

db.execSQL("UPDATE DB_TABLE SET YOUR_COLUMN='newValue' WHERE id=6 ");

O

ContentValues newValues = new ContentValues();
newValues.put("YOUR_COLUMN", "newValue");

db.update("YOUR_TABLE", newValues, "id=6", null);

O

ContentValues newValues = new ContentValues();
newValues.put("YOUR_COLUMN", "newValue");

String[] args = new String[]{"user1", "user2"};
db.update("YOUR_TABLE", newValues, "name=? OR name=?", args);
luiscarlostic
fuente
53

Todo está en el tutorial sobre cómo hacer eso:

    ContentValues args = new ContentValues();
    args.put(columnName, newValue);
    db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null);

Use ContentValuespara establecer las columnas actualizadas y luego el update()método en el que debe especificar, la tabla y un criterio para actualizar solo las filas que desea actualizar.

Stephan
fuente
-1. La cuestión es actualizar una sola columna en una fila, no actualizar una fila completa. La respuesta de Alex es correcta.
Dheeraj Vepakomma
7
Dheeraj, puede agregar tantos args.put (columnName, newValue) como desee.
Simon Rolin
18

siempre puede ejecutar SQL.

update [your table] set [your column]=value

por ejemplo

update Foo set Bar=125
Alex Gitelman
fuente
3
¿Por qué usar una declaración SQL explícita, si hay una API (bastante fácil y conveniente) para eso?
Stephan
3
@ Stephan: Porque no es SQLite estándar. La API se bloquea demasiado, especialmente cuando la base de datos se comparte entre aplicaciones en diferentes plataformas
Rafael Nobre
@ Stephan Esta es la única respuesta correcta a la pregunta. El OP quiere actualizar una sola columna en una fila, no actualizar una fila completa.
Dheeraj Vepakomma
Usar la API es una mejor apuesta aquí, me sorprende que no haya una solución intermedia, la biblioteca C le permite definir un SQL para ejecutar y establecer formateadores y tokens, el siguiente paso es usar la api C para vincular variables al tokens en la cadena SQL, evitando así errores de análisis y problemas de citas, etc ... aquí es casi demasiado asistido, ni siquiera escribir parte del SQL, no se siente bien ... sino más bien esto, luego una cadena SQL concatenada.
Daniel
Este método fallará cuando la cadena contenga comillas simples y algún carácter especial. @Nike respuesta es correcta.
Soleado
1

El objeto SQLiteDatabase depende del tipo de operación en la base de datos.

Más información, visite el sitio web oficial:

https://developer.android.com/training/basics/data-storage/databases.html#UpdateDbRow

Explica cómo manipular las consultas en la base de datos SQLite.

INSERTAR FILA

Obtiene el repositorio de datos en modo de escritura

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Cree un nuevo mapa de valores, donde los nombres de las columnas son las claves

ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_CONTENT, content);

Inserte la nueva fila, devolviendo el valor de la clave principal de la nueva fila

long newRowId;
newRowId = db.insert(
     FeedEntry.TABLE_NAME,
     FeedEntry.COLUMN_NAME_NULLABLE,
     values);

ACTUALIZAR FILA

Defina la parte "dónde" de la consulta.

String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";

Especifique los argumentos en el orden de los marcadores de posición.

String[] selectionArgs = { String.valueOf(rowId) };


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Nuevo valor para una columna

ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);

Qué fila actualizar, según el ID

String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
String[] selectionArgs = { String.valueOf(rowId) };
    int count = db.update(
    FeedReaderDbHelper.FeedEntry.TABLE_NAME,
    values,
    selection,
    selectionArgs);
Gustavo Eduardo Belduma
fuente
Aunque el sitio web vinculado puede contener una respuesta a la pregunta, su respuesta parece incompleta. Los enlaces pueden caducar o romperse de otra manera. Agregue el código / información relevante del sitio web vinculado a su respuesta.
Mike
Por supuesto que lo entiendo, simplemente puse literalmente la solución que funcionó para mí y por supuesto para su supuesta fuente de donde obtuve
Gustavo Eduardo Belduma
1

Utilizo esta clase para manejar la base de datos. Espero que ayude a alguien en el futuro.

Codificación feliz.

public class Database {

private static class DBHelper extends SQLiteOpenHelper {

    /**
     * Database name
     */
    private static final String DB_NAME = "db_name";

    /**
     * Table Names
     */
    public static final String TABLE_CART = "DB_CART";


    /**
     *  Cart Table Columns
     */
    public static final String CART_ID_PK = "_id";// Primary key

    public static final String CART_DISH_NAME = "dish_name";
    public static final String CART_DISH_ID = "menu_item_id";
    public static final String CART_DISH_QTY = "dish_qty";
    public static final String CART_DISH_PRICE = "dish_price";

    /**
     * String to create reservation tabs table
     */
    private final String CREATE_TABLE_CART = "CREATE TABLE IF NOT EXISTS "
            + TABLE_CART + " ( "
            + CART_ID_PK + " INTEGER PRIMARY KEY, "
            + CART_DISH_NAME + " TEXT , "
            + CART_DISH_ID + " TEXT , "
            + CART_DISH_QTY + " TEXT , "
            + CART_DISH_PRICE + " TEXT);";


    public DBHelper(Context context) {
        super(context, DB_NAME, null, 2);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_CART);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        db.execSQL("DROP TABLE IF EXISTS " + CREATE_TABLE_CART);
        onCreate(db);
    }

}


     /**
      * CART handler
      */
      public static class Cart {


    /**
     * Check if Cart is available or not
     *
     * @param context
     * @return
     */
    public static boolean isCartAvailable(Context context) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        boolean exists = false;

        try {
            String query = "SELECT * FROM " + DBHelper.TABLE_CART;
            Cursor cursor = db.rawQuery(query, null);
            exists = (cursor.getCount() > 0);
            cursor.close();
            db.close();
        } catch (SQLiteException e) {
            db.close();
        }

        return exists;
    }


    /**
     * Insert values in cart table
     *
     * @param context
     * @param dishName
     * @param dishPrice
     * @param dishQty
     * @return
     */
    public static boolean insertItem(Context context, String itemId, String dishName, String dishPrice, String dishQty) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DBHelper.CART_DISH_ID, "" + itemId);
        values.put(DBHelper.CART_DISH_NAME, "" + dishName);
        values.put(DBHelper.CART_DISH_PRICE, "" + dishPrice);
        values.put(DBHelper.CART_DISH_QTY, "" + dishQty);

        try {
            db.insert(DBHelper.TABLE_CART, null, values);
            db.close();
            return true;
        } catch (SQLiteException e) {
            db.close();
            return false;
        }
    }

    /**
     * Check for specific record by name
     *
     * @param context
     * @param dishName
     * @return
     */
    public static boolean isItemAvailable(Context context, String dishName) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        boolean exists = false;

        String query = "SELECT * FROM " + DBHelper.TABLE_CART + " WHERE "
                + DBHelper.CART_DISH_NAME + " = '" + String.valueOf(dishName) + "'";


        try {
            Cursor cursor = db.rawQuery(query, null);

            exists = (cursor.getCount() > 0);
            cursor.close();

        } catch (SQLiteException e) {

            e.printStackTrace();
            db.close();

        }

        return exists;
    }

    /**
     * Update cart item by item name
     *
     * @param context
     * @param dishName
     * @param dishPrice
     * @param dishQty
     * @return
     */
    public static boolean updateItem(Context context, String itemId, String dishName, String dishPrice, String dishQty) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DBHelper.CART_DISH_ID, itemId);
        values.put(DBHelper.CART_DISH_NAME, dishName);
        values.put(DBHelper.CART_DISH_PRICE, dishPrice);
        values.put(DBHelper.CART_DISH_QTY, dishQty);

        try {

            String[] args = new String[]{dishName};
            db.update(DBHelper.TABLE_CART, values, DBHelper.CART_DISH_NAME + "=?", args);

            db.close();


            return true;
        } catch (SQLiteException e) {
            db.close();

            return false;
        }
    }

    /**
     * Get cart list
     *
     * @param context
     * @return
     */
    public static ArrayList<CartModel> getCartList(Context context) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        ArrayList<CartModel> cartList = new ArrayList<>();

        try {
            String query = "SELECT * FROM " + DBHelper.TABLE_CART + ";";

            Cursor cursor = db.rawQuery(query, null);


            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

                cartList.add(new CartModel(
                        cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_ID)),
                        cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_NAME)),
                        cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_QTY)),
                        Integer.parseInt(cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_PRICE)))
                ));
            }

            db.close();

        } catch (SQLiteException e) {
            db.close();
        }
        return cartList;
    }

   /**
     * Get total amount of cart items
     *
     * @param context
     * @return
     */
    public static String getTotalAmount(Context context) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        double totalAmount = 0.0;

        try {
            String query = "SELECT * FROM " + DBHelper.TABLE_CART + ";";

            Cursor cursor = db.rawQuery(query, null);


            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

                totalAmount = totalAmount + Double.parseDouble(cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_PRICE))) *
                        Double.parseDouble(cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_QTY)));
            }

            db.close();


        } catch (SQLiteException e) {
            db.close();
        }


        if (totalAmount == 0.0)
            return "";
        else
            return "" + totalAmount;
    }


    /**
     * Get item quantity
     *
     * @param context
     * @param dishName
     * @return
     */
    public static String getItemQty(Context context, String dishName) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        Cursor cursor = null;
        String query = "SELECT * FROM " + DBHelper.TABLE_CART + " WHERE " + DBHelper.CART_DISH_NAME + " = '" + dishName + "';";
        String quantity = "0";

        try {
            cursor = db.rawQuery(query, null);

            if (cursor.getCount() > 0) {

                cursor.moveToFirst();
                quantity = cursor.getString(cursor
                        .getColumnIndex(DBHelper.CART_DISH_QTY));

                return quantity;
            }


        } catch (SQLiteException e) {
            e.printStackTrace();
        }

        return quantity;
    }


    /**
     * Delete cart item by name
     *
     * @param context
     * @param dishName
     */
    public static void deleteCartItem(Context context, String dishName) {
        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        try {

            String[] args = new String[]{dishName};
            db.delete(DBHelper.TABLE_CART, DBHelper.CART_DISH_NAME + "=?", args);

            db.close();
        } catch (SQLiteException e) {
            db.close();
            e.printStackTrace();
        }

    }


}//End of cart class

/**
 * Delete database table
 *
 * @param context
 */
public static void deleteCart(Context context) {
    DBHelper dbHelper = new DBHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    try {

        db.execSQL("DELETE FROM " + DBHelper.TABLE_CART);

    } catch (SQLiteException e) {
        e.printStackTrace();
    }

}

}

Uso:

  if(Database.Cart.isCartAvailable(context)){

       Database.deleteCart(context);

   }
Adnan Bin Mustafa
fuente