2013-01-03 16 views
6

czy istnieje sposób, aby zmienić funkcję:Wstawianie lub aktualizowanie w SQlite i Android przy użyciu metody database.query();

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

jest to surowy insert, chciałbym zmienić tę funkcję, aby zaktualizować lub wstawić odpowiednio. Chciałbym to zmienić, ponieważ już korzystam z tej funkcji w niektórych miejscach, ale teraz muszę wybrać, czy wstawić wiersz, czy zaktualizować (lub ignorując wstawkę) wiersz z tym samym COLUMN_NOME. Czy ktoś może mi w tym pomóc?

Chodzi mi o to, że chciałbym wstawić TYLKO nowy wiersz, jeśli nie ma innego o tej samej nazwie (jak zwykle wiesz).

Odpowiedz

13

można nazwać int nRowsEffected = database.update(...); jeśli istnieją żadne wiersze dokonywane przez aktualizację albo wiersz nie istnieje (lub hosed swój update()!) Więc trzeba zadzwonić database.insert(...). oczywiście jeśli nRowsEffected> 0 to już koniec.

+0

dzięki, jest to sposób wybrałem, poniewaz mogę zmienić args jeśli muszę wstawić, ponieważ muszę wprowadzić pewne wartości domyślne. –

8

Można użyć execSQL i używać 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); 
+1

dzięki, myślę, że to jest czyste rozwiązanie, ale muszę zmienić argumenty, jeśli jest to wstawka zamiast aktualizacji, przy okazji, ta "wstaw lub wymień" jest naprawdę dobra: D –

+3

Ostrożnie, włóż lub wymień różnić się od tego, czego oczekujesz od wstawienia lub aktualizacji. Zobacz moją odpowiedź tutaj: http://stackoverflow.com/a/4253806/365596 – gregschlom

1

Przede wszystkim mają funkcję zapisu, który jest sprawdzić czy id to istnieje w określonej tabeli jak:

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

Trzeba zdać table_name i id w tym jak

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

Mam nadzieję, że ci to pomoże.

31

Można użyć insertWithOnConflict() jeśli chcesz wkładką lub zaktualizować, w zależności w czy rekord istnieje lub nie:

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

najlepsza odpowiedź niż zaakceptowana odpowiedź –

+5

"Zamień" to ** nie ** tak samo jak "aktualizacja" w niektórych kontekstach. Wyobraź sobie, że chcesz tylko zastąpić tylko te pola, które są obecne w podanych 'ContentValues'. Może się to zdarzyć w przypadkach, gdy interfejsy API WWW zwrócą częściowe obiekty (sam jestem dzisiaj w obliczu tego problemu). –

Powiązane problemy