SQLite Android: istruzione di aggiornamento


91

Devo implementare SQLite nella mia applicazione. Ho seguito questo tutorial .. Creazione e utilizzo di database in Android One

Funziona tutto bene. Ho inserito 1 riga con 5 colonne. Ora voglio aggiornare il valore di 1 sola colonna e gli altri rimarranno gli stessi.

C'è un metodo di aggiornamento nel tutorial ma necessita di tutti i parametri, tuttavia voglio aggiornare solo una colonna.


L'URL richiesto /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one non è stato trovato su questo server.
Machado

Risposte:


165

Puoi usare il codice qui sotto.

String strFilter = "_id=" + Id;
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
myDB.update("titles", args, strFilter, null);

13
Potresti anche fare: myDB.update ("titoli", args, strFilter, new String [] {Integer.toString (ID)}); se hai strFilter impostato su "_id =?" ... La cosa fastidiosa con un singolo elemento è che devi ancora metterlo in un array, il che può renderlo scomodo. Tuttavia, up ha votato per la risposta giusta.
joshhendo

4
@Dheeraj - Questo aggiornerà solo la colonna che viene aggiunta all'oggetto
ContentValues

2
Se non sbaglio, il codice di @joshhendo dovrebbe anche impedire le SQL injection, qualcosa che questa risposta non prende in considerazione. Poiché l'argomento viene passato come parametro, viene ignorato dal codice sottostante.
R41 il

Avresti bisogno di inserire virgolette intorno al tuo Id. Qualcosa del tipo:String strFilter = "_id='" + Id + "'";
Guillaume

119

Puoi provare:

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

53

È tutto nel tutorial come farlo:

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

Utilizzare ContentValuesper impostare le colonne aggiornate e quindi il update()metodo in cui è necessario specificare, la tabella e un criterio per aggiornare solo le righe che si desidera aggiornare.


-1. La domanda è aggiornare una singola colonna in una riga, non aggiornare un'intera riga. La risposta di Alex è corretta.
Dheeraj Vepakomma

7
Dheeraj, puoi semplicemente aggiungere tutti gli args.put (columnName, newValue) che desideri.
Simon Rolin

18

puoi sempre eseguire SQL.

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

per esempio

update Foo set Bar=125

3
Perché usare un'istruzione SQL esplicita, se esiste un'API (piuttosto semplice e conveniente) per questo?
Stephan

3
@ Stephan: Perché non è SQLite standard. L'API si lega troppo specialmente quando il DB è condiviso tra app su piattaforme diverse
Rafael Nobre

@Stephan Questa è l'unica risposta corretta alla domanda. L'OP vuole aggiornare una singola colonna in una riga, non per aggiornare un'intera riga.
Dheeraj Vepakomma

L'uso dell'API è una scommessa migliore qui, sono sorpreso che non ci sia una soluzione intermedia, la libreria C ti consente di definire un SQL per eseguire e impostare formattatori e token, il passaggio successivo è usare l'api C per associare le variabili al token nella stringa SQL, evitando così errori di parsing e problemi di quotazione ecc ... qui è quasi troppo assistito, non si scrive nemmeno una parte dell'SQL, non si sente bene ... ma piuttosto questa è una stringa SQL concatenata.
Daniel

Questo metodo fallirà quando la stringa contiene virgolette singole e alcuni caratteri speciali. La risposta di @Nike è corretta.
Soleggiato

1

L'oggetto SQLiteDatabase dipende dal tipo di operazione sul database.

Maggiori informazioni, visita il sito ufficiale:

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

Spiega come manipolare le consultazioni sul database SQLite.

INSERIRE RIGA

Ottiene il repository di dati in modalità di scrittura

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Crea una nuova mappa di valori, dove i nomi delle colonne sono le chiavi

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

Inserisci la nuova riga, restituendo il valore della chiave primaria della nuova riga

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

RIGA DI AGGIORNAMENTO

Definisci la parte "dove" della query.

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

Specificare gli argomenti in ordine segnaposto.

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


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Nuovo valore per una colonna

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

Quale riga aggiornare, in base all'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);

Sebbene il sito Web collegato possa contenere una risposta alla domanda, la tua risposta sembra incompleta. I collegamenti possono scadere o interrompersi in un altro modo. Si prega di aggiungere il codice / le informazioni pertinenti dal sito Web collegato alla risposta.
Mike

Certo che capisco, ho letteralmente messo la soluzione che ha funzionato per me e, naturalmente, per la sua presunta fonte dove ho ottenuto
Gustavo Eduardo Belduma

1

Uso questa classe per gestire il database e spero che possa aiutare qualcuno in futuro.

Buona codifica.

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

}

}

Utilizzo:

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

       Database.deleteCart(context);

   }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.