7

私の機能を変更する方法はありますか?

public categorie createCategoria(String categoria) {
            ContentValues values = new ContentValues();
            values.put(MySQLiteHelper.COLUMN_NOME, categoria);
            values.put(MySQLiteHelper.COLUMN_PREF, 0);

            long insertId = database.insert(MySQLiteHelper.TABLE_CATEGORIE, null,
                values);

            Cursor cursor = database.query(MySQLiteHelper.TABLE_CATEGORIE,
                allCategorieColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null,
                null, null, null);
            cursor.moveToFirst();
            categorie newCategoria = cursorToCategorie(cursor);
            cursor.close();
            return newCategoria;
          } 

これは生の挿入です。それに応じて更新または挿入するようにこの関数を変更したいと思います。すでにいくつかの場所でこの関数を使用しているため、これを変更したいのですが、行を挿入するか、同じ行を更新する(または挿入を無視する)かを選択する必要がありますCOLUMN_NOME。誰かが私がこれをするのを手伝ってくれる?

つまり、同じ名前の行がない場合にのみ、新しい行を挿入したいということです(いつものように)。

4

4 に答える 4

34

レコードが存在するかどうかに応じて、挿入または更新する場合は、insertWithOnConflict()を使用できます。

SQLiteDatabase db = this.getWritableDatabase();

ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_ID, id);
contentValues.put(COLUMN_VALUE, value);

// this will insert if record is new, update otherwise
db.insertWithOnConflict(TABLE, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
于 2015-08-11T21:19:31.770 に答える
15

int nRowsEffected = database.update(...);更新の影響を受ける行がない場合、または行が存在しない場合(または、 !)を呼び出すupdate()ことができるため、を呼び出す必要がありますdatabase.insert(...)。もちろん、nRowsEffected> 0の場合は、これで完了です。

于 2013-01-03T16:53:19.447 に答える
8

execSQLを使用して、INSERTORREPLACEを使用できます

String[] args = {"1", "newOrOldCategory"}; // where 1 is the category id
getWritableDatabase().execSQL("INSERT OR REPLACE INTO table_name (idColoumn, categoryColumn) VALUES (?, ?)", args);
于 2013-01-03T16:53:38.997 に答える
1

まず、次のidような特定のテーブルに存在するかどうかをチェックする書き込み関数があります。

   /**
     * @param table_name
     * @param server_id
     * @return
     */
    public boolean isServerIdExist(String table_name, int server_id) {
        long line = DatabaseUtils.longForQuery(mDB, "SELECT COUNT(*) FROM " + table_name + " WHERE id=?",
                new String[]{Integer.toString(server_id)});
        return line > 0;
    }

あなたは合格しなければなりませんtable_nameそしてidそのように

   /**
     * INSERT in TABLE_ACCOUNT_DEVICE
     **/
    public long insertOrUpdateAccountDevice(int server_id, int account_id,
                                            String device_name, String device_id,
                                            String last_active, String itp,
                                            String utp, int status) {

        ContentValues values = new ContentValues();

        values.put(ACCOUNT_DEVICE_ACCOUNT_ID, account_id);
        values.put(ACCOUNT_DEVICE_DEVICE_NAME, device_name);
        values.put(ACCOUNT_DEVICE_DEVICE_ID, device_id);
        values.put(ACCOUNT_DEVICE_LAST_ACTIVE, last_active);
        values.put(ACCOUNT_DEVICE_ITP, itp);
        values.put(ACCOUNT_DEVICE_UTP, utp);
        values.put(ACCOUNT_DEVICE_STATUS, status); // 0=pending, 1=active, 2=Inactive, -1=not_found

        /**
         * isServerIdExists
         */
        if (isServerIdExists(TABLE_ACCOUNT_DEVICE, server_id)) {
            values.put(ACCOUNT_DEVICE_SERVER_ID, server_id);
            return mDB.insert(TABLE_ACCOUNT_DEVICE, null, values);
        } else {
            return mDB.update(TABLE_ACCOUNT_DEVICE, values, ACCOUNT_DEVICE_SERVER_ID + " =? ",
                    new String[]{Integer.toString(server_id)});
        }
    }

それがあなたを助けることを願っています。

于 2015-08-08T09:44:16.627 に答える