Android SQLite: Update-Anweisung

91

Ich muss SQLite in meiner Anwendung implementieren. Ich habe dieses Tutorial befolgt. Erstellen und Verwenden von Datenbanken in Android One

Alles funktioniert gut. Ich habe 1 Zeile mit 5 Spalten eingefügt. Jetzt möchte ich nur den Wert von 1 Spalte aktualisieren und andere bleiben gleich.

Es gibt eine Aktualisierungsmethode im Tutorial, die jedoch alle Parameter benötigt. Ich möchte jedoch nur eine Spalte aktualisieren.

vivek_Android
quelle
Die angeforderte URL /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one wurde auf diesem Server nicht gefunden.
Machado

Antworten:

165

Sie können den folgenden Code verwenden.

String strFilter = "_id=" + Id;
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
myDB.update("titles", args, strFilter, null);
Nikhil
quelle
13
Sie können sogar Folgendes tun: myDB.update ("title", args, strFilter, new String [] {Integer.toString (ID)}); Wenn Sie strFilter auf "_id =?" gesetzt haben ... Das ärgerliche an einem einzelnen Element ist, dass Sie es immer noch in ein Array einfügen müssen, was es unpraktisch machen kann. Trotzdem stimmte up für die richtige Antwort.
Joshhendo
4
@Dheeraj - Dies wird nur die Spalte aktualisieren, die dem ContentValues-Objekt hinzugefügt wird
Simonw
2
Wenn ich mich nicht irre, sollte der Code von @joshhendo auch SQL-Injektionen verhindern, was in dieser Antwort nicht berücksichtigt wird. Da das Argument als Parameter übergeben wird, wird es vom zugrunde liegenden Code maskiert.
R41n
Sie müssten Anführungszeichen um Ihre setzen Id. So etwas wie:String strFilter = "_id='" + Id + "'";
Guillaume
119

Du kannst es versuchen:

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

Oder

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

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

Oder

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
quelle
53

Im Tutorial erfahren Sie alles darüber:

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

Verwenden Sie diese Option, ContentValuesum die aktualisierten Spalten und dann die update()Methode, in der Sie angeben müssen, die Tabelle und ein Kriterium festzulegen, um nur die Zeilen zu aktualisieren, die Sie aktualisieren möchten.

Stephan
quelle
-1. Die Frage ist, eine einzelne Spalte in einer Zeile zu aktualisieren, nicht eine ganze Zeile. Alex 'Antwort ist richtig.
Dheeraj Vepakomma
7
Dheeraj, Sie können einfach so viele args.put (columnName, newValue) hinzufügen, wie Sie möchten.
Simon Rolin
18

Sie können SQL jederzeit ausführen.

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

beispielsweise

update Foo set Bar=125
Alex Gitelman
quelle
3
Warum eine explizite SQL-Anweisung verwenden, wenn es dafür eine (ziemlich einfache und bequeme) API gibt?
Stephan
3
@Stephan: Weil es kein Standard-SQLite ist. Die API ist zu eng miteinander verbunden, insbesondere wenn die Datenbank von Apps auf verschiedenen Plattformen gemeinsam genutzt wird
Rafael Nobre,
@Stephan Dies ist die einzig richtige Antwort auf die Frage. Das OP möchte eine einzelne Spalte in einer Zeile aktualisieren, nicht eine ganze Zeile.
Dheeraj Vepakomma
Die Verwendung der API ist hier eine bessere Wahl. Ich bin überrascht, dass es keine mittlere Lösung gibt. Mit der C-Bibliothek können Sie eine SQL definieren, um Formatierer und Token auszuführen und festzulegen. Der nächste Schritt ist die Verwendung der C-API zum Binden von Variablen an die Token in der SQL-Zeichenfolge, wodurch Analysefehler und Anführungszeichenprobleme usw. vermieden werden. Hier ist es fast zu hilfreich, nicht einmal einen Teil der SQL zu schreiben, fühlt sich nicht gut an ... sondern dies ist eine verkettete SQL-Zeichenfolge.
Daniel
Diese Methode schlägt fehl, wenn die Zeichenfolge einfache Anführungszeichen und Sonderzeichen enthält. @ Nike Antwort ist richtig.
Sunny
1

Das SQLiteDatabase-Objekt hängt von der Art der Operation in der Datenbank ab.

Weitere Informationen finden Sie auf der offiziellen Website:

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

Es wird erläutert, wie Sie Konsultationen in der SQLite-Datenbank bearbeiten.

REIHE EINFÜGEN

Ruft das Datenrepository im Schreibmodus ab

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Erstellen Sie eine neue Wertekarte, in der Spaltennamen die Schlüssel sind

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

Fügen Sie die neue Zeile ein und geben Sie den Primärschlüsselwert der neuen Zeile zurück

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

UPDATE ROW

Definieren Sie den 'where'-Teil der Abfrage.

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

Geben Sie die Argumente in der Reihenfolge der Platzhalter an.

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


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Neuer Wert für eine Spalte

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

Welche Zeile aktualisiert werden soll, basierend auf der 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
quelle
Obwohl die verlinkte Website möglicherweise eine Antwort auf die Frage enthält, scheint Ihre Antwort unvollständig zu sein. Links können auf andere Weise verfallen oder unterbrochen werden. Bitte fügen Sie Ihrer Antwort den relevanten Code / die relevanten Informationen von der verlinkten Website hinzu.
Mike
Natürlich verstehe ich, ich habe nur buchstäblich die Lösung, die für mich funktioniert hat, und natürlich für die angebliche Quelle, aus der ich sie erhalten habe
Gustavo Eduardo Belduma
1

Ich benutze diese Klasse, um mit Datenbanken umzugehen. Ich hoffe, sie wird in Zukunft jemandem helfen.

Viel Spaß beim Codieren.

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

}

}}

Verwendung:

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

       Database.deleteCart(context);

   }
Adnan Bin Mustafa
quelle