Android SQLite: déclaration de mise à jour

91

J'ai besoin d'implémenter SQLite dans mon application. J'ai suivi ce tutoriel .. Créer et utiliser des bases de données sous Android One

Tout fonctionne bien. J'ai inséré 1 ligne avec 5 colonnes. Maintenant, je veux mettre à jour la valeur de 1 colonne uniquement et les autres resteront les mêmes.

Il existe une méthode de mise à jour dans le didacticiel, mais elle nécessite tous les paramètres, mais je souhaite mettre à jour une seule colonne.

vivek_Android
la source
L'URL demandée /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one n'a pas été trouvée sur ce serveur.
Machado

Réponses:

165

Vous pouvez utiliser le code ci-dessous.

String strFilter = "_id=" + Id;
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
myDB.update("titles", args, strFilter, null);
Nikhil
la source
13
Vous pouvez même faire: myDB.update ("titres", args, strFilter, new String [] {Integer.toString (ID)}); si vous avez défini strFilter sur "_id =?" ... La chose ennuyeuse avec un seul élément est que vous devez toujours le mettre dans un tableau, ce qui peut le rendre gênant. Pourtant, jusqu'à voté pour la bonne réponse.
joshhendo
4
@Dheeraj - Cela ne mettra à jour que la colonne qui est ajoutée à l'objet
ContentValues
2
Si je ne me trompe pas, le code de @joshhendo devrait également empêcher les injections SQL, ce que cette réponse ne prend pas en compte. Puisque l'argument est passé en tant que paramètre, il est échappé par le code sous-jacent.
r41n
Vous auriez besoin de mettre des guillemets autour de votre Id. Quelque chose comme:String strFilter = "_id='" + Id + "'";
Guillaume
119

Tu peux essayer:

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

Ou

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

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

Ou

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
la source
53

Tout est dans le tutoriel comment faire cela:

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

Utilisez ContentValuespour définir les colonnes mises à jour et que la update()méthode dans laquelle vous devez spécifier, la table et un critère pour mettre à jour uniquement les lignes que vous souhaitez mettre à jour.

Stephan
la source
-1. La question est de mettre à jour une seule colonne dans une ligne, pas de mettre à jour une ligne entière. La réponse d'Alex est correcte.
Dheeraj Vepakomma
7
Dheeraj, vous pouvez simplement ajouter autant d'args.put (columnName, newValue) que vous le souhaitez.
Simon Rolin
18

vous pouvez toujours exécuter SQL.

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

par exemple

update Foo set Bar=125
Alex Gitelman
la source
3
Pourquoi utiliser une instruction SQL explicite, s'il existe une API (assez simple et pratique) pour cela?
Stephan
3
@Stephan: Parce que ce n'est pas SQLite standard. L'API se lie trop spécialement lorsque la base de données est partagée entre des applications sur différentes plates
Rafael Nobre
@Stephan C'est la seule réponse correcte à la question. L'OP souhaite mettre à jour une seule colonne dans une ligne, pas mettre à jour une ligne entière.
Dheeraj Vepakomma
L'utilisation de l'API est un meilleur pari ici, je suis surpris qu'il n'y ait pas de solution intermédiaire, la bibliothèque C vous permet de définir un SQL pour exécuter et définir des formateurs et des jetons, l'étape suivante consiste à utiliser l'API C pour lier des variables au jetons dans la chaîne SQL, évitant ainsi les erreurs d'analyse et les problèmes de guillemets, etc. ici, c'est presque trop assisté, ne même pas écrire une partie du SQL, ne se sent pas bien ... mais plutôt une chaîne SQL concaténée.
Daniel
Cette méthode échouera lorsque la chaîne contient des guillemets simples et un caractère spécial. La réponse @Nike est correcte.
Ensoleillé du
1

L'objet SQLiteDatabase dépend du type d'opération sur la base de données.

Plus d'informations, visitez le site officiel:

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

Il explique comment manipuler les consultations sur la base de données SQLite.

INSÉRER UNE LIGNE

Obtient le référentiel de données en mode écriture

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Créer une nouvelle carte de valeurs, où les noms de colonne sont les clés

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

Insérez la nouvelle ligne, renvoyant la valeur de clé primaire de la nouvelle ligne

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

MISE À JOUR DE LA LIGNE

Définissez la partie «où» de la requête.

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

Spécifiez les arguments dans l'ordre des espaces réservés.

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


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Nouvelle valeur pour une colonne

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

Quelle ligne mettre à jour, en fonction de l'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
la source
Bien que le site Web lié puisse contenir une réponse à la question, votre réponse semble incomplète. Les liens peuvent expirer ou se rompre d'une autre manière. Veuillez ajouter le code / les informations pertinentes du site Web lié à votre réponse.
Mike
Bien sûr je comprends, je viens de mettre littéralement la solution qui a fonctionné pour moi et bien sûr pour sa source présumée où j'ai obtenu
Gustavo Eduardo Belduma
1

J'utilise cette classe pour gérer la base de données et j'espère que cela aidera quelqu'un à l'avenir.

Bon codage.

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

}

}

Usage:

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

       Database.deleteCart(context);

   }
Adnan Bin Mustafa
la source