2013-01-03 31 views
6

मेरे समारोह को बदलने के लिए एक तरीका है:डेटाबेस.क्वायरी() का उपयोग कर एसक्यूलाइट और एंड्रॉइड में डालें या अपडेट करें;

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

यह एक कच्चे डालने है, मैं इसे अपडेट करने या तदनुसार सम्मिलित करने के लिए इस समारोह को बदलना चाहते हैं। मैं इस becouse को बदलना चाहता हूं, मैं पहले से ही इस फ़ंक्शन का उपयोग कुछ स्थानों पर कर रहा हूं, लेकिन अब मुझे यह चुनने की ज़रूरत है कि एक पंक्ति या अद्यतन डालें (या सम्मिलित अनदेखा करें) एक पंक्ति COLUMN_NOME के साथ एक पंक्ति डालें। क्या कोई मुझे ऐसा करने में मदद कर सकता है?

मेरा मतलब है कि मैं केवल एक नई पंक्ति डालना चाहूंगा यदि एक ही नाम के साथ कोई दूसरा नहीं है (जैसा कि आप जानते हैं)।

उत्तर

13

आप int nRowsEffected = database.update(...); कह सकते हैं अगर कोई पंक्तियों अद्यतन से प्रभावित कर रहे हैं या तो पंक्ति मौजूद नहीं है (या तुम hosed अपने update()!) इसलिए आप database.insert(...) कॉल करने के लिए की जरूरत है। बेशक अगर nRowsEffected> 0 तो आप कर रहे हैं।

+0

धन्यवाद, इस तरह से मैं चुना है, क्योंकि मैं आर्ग को बदल सकते हैं अगर मुझे डालना है, क्योंकि मुझे कुछ डिफ़ॉल्ट मान रखना है। –

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

धन्यवाद, मुझे लगता है कि यह साफ समाधान है, लेकिन मुझे तर्कों को बदलना है यदि यह अपडेट के बजाय एक डालने वाला है, वैसे, यह "डालने या प्रतिस्थापित करना" वास्तव में अच्छी बात है: डी –

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

उम्मीद है कि यह आपकी मदद करेगा।

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' में मौजूद हैं। यह उन मामलों में हो सकता है जहां वेब एपीआई आंशिक वस्तुओं को लौटते हैं (मुझे आज इस समस्या का सामना करना पड़ रहा है)। –