2013-01-03 103 views
6

有沒有辦法改變我的功能:使用database.query()在SQlite和Android中插入或更新;

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相同的行。有人可以幫我做這個嗎?

我的意思是我只想插入一個新的行,如果沒有另一個具有相同的名稱(通常你知道)。

回答

13

如果沒有行受到更新影響,那麼您可以調用int nRowsEffected = database.update(...);該行不存在(或者您已清除update()!)因此您需要致電database.insert(...)。當然,如果nRowsEffected> 0,那麼你就完成了。

+0

感謝,這是我自己選擇的方式,becouse我可以改變ARGS如果我不得不插入,因爲我必須把一些默認值。 –

8

您可以使用execSQL和使用插入或更換

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

謝謝,我想這是乾淨的解決方案,但我必須改變參數,如果它是插入而不是更新,順便說一句,「插入或替換」是一件非常好的事情:D –

+3

小心,插入或替換可能與插入或更新所期望的不同。在這裏看到我的答案:http://stackoverflow.com/a/4253806/365596 – gregschlom

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

希望它能幫助你。

31

您可以使用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); 
+3

最佳答案比接受的答案 –

+5

「替換」是**不**在某些情況下與「更新」相同。試想一下,如果您只想替換給定的「ContentValues」中存在的那些字段。這可能發生在Web API返回部分對象的情況下(我今天自己面臨這個問題)。 –

相關問題