【问题标题】:Insert or update in SQlite and Android using the database.query();使用 database.query() 在 SQlite 和 Android 中插入或更新;
【发布时间】:2015-08-12 05:19:31
【问题描述】:

有没有办法改变我的功能:

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 的行。有人可以帮我做这个吗?

我的意思是,只有在没有另一个同名的行时,我才想插入一个新行(就像往常一样,你知道)。

【问题讨论】:

    标签: android sqlite insert


    【解决方案1】:

    如果您想插入或更新,您可以使用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);
    

    【讨论】:

    • “替换”在某些情况下与“更新”相同。想象一下,如果您只想替换给定ContentValues 中存在的那些字段。这可能发生在 Web API 返回部分对象的情况下(我自己今天也遇到了这个问题)。
    【解决方案2】:

    如果没有受更新影响的行,或者该行不存在(或者您冲洗了您的update()!),您可以调用int nRowsEffected = database.update(...);,因此您需要调用database.insert(...)。当然如果 nRowsEffected > 0 那么你就完成了。

    【讨论】:

    • 谢谢,这是我选择的方式,因为如果我必须插入,我可以更改 args,因为我必须输入一些默认值。
    【解决方案3】:

    您可以使用 execSQL 并使用 INSERT OR REPLACE

    String[] args = {"1", "newOrOldCategory"}; // where 1 is the category id
    getWritableDatabase().execSQL("INSERT OR REPLACE INTO table_name (idColoumn, categoryColumn) VALUES (?, ?)", args);
    

    【讨论】:

    • 谢谢,我想这是干净的解决方案,但如果它是插入而不是更新,我必须更改参数,顺便说一下,这个“插入或替换”是一件非常好的事情:D
    • 小心,插入或替换可能与您对插入或更新的期望不同。在这里查看我的答案:stackoverflow.com/a/4253806/365596
    【解决方案4】:

    首先你有写函数,检查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_nameid

       /**
         * 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)});
            }
        }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2013-02-23
      • 1970-01-01
      • 2017-09-01
      • 2013-08-06
      相关资源
      最近更新 更多