2012-02-22 68 views
3

對此有任何幫助,確定它很簡單,但看不到它。ContentValues數組中的重複ContentValues

做一個bulkInsert到內容提供者(UserDictionary),但所有插入有相同的「字」值。問題是ContentValues數組。 這是一些測試代碼,我有:

public void mClick(View v){ 

     int batchSize = 25; 
     ContentValues[] mValueArray = new ContentValues[batchSize]; 
     List<ContentValues>mValueList = new ArrayList<ContentValues>(); 
     ContentValues mNewValues = new ContentValues(); 

     mNewValues.put(UserDictionary.Words.APP_ID, this.getPackageName()); 
     mNewValues.put(UserDictionary.Words.LOCALE, "en"); 
     mNewValues.put(UserDictionary.Words.FREQUENCY, "255"); 
     mNewValues.put(UserDictionary.Words.WORD, "WORD1"); 

     mValueList.add(mNewValues); 

     mNewValues.put(UserDictionary.Words.APP_ID, this.getPackageName()); 
     mNewValues.put(UserDictionary.Words.LOCALE, "en"); 
     mNewValues.put(UserDictionary.Words.FREQUENCY, "255"); 
     mNewValues.put(UserDictionary.Words.WORD, "WORD2"); 

     mValueList.add(mNewValues); 

     mValueArray = new ContentValues[mValueList.size()]; 
     mValueList.toArray(mValueArray); 

     Log.i(TAG,mValueList.toString()); 
     Log.i(TAG,mValueArray[0].toString()); 
     Log.i(TAG,mValueArray[1].toString()); 


    } 

和日誌,可以看出,mValueArray有重複的值。

02-22 12:33:51.060: I/log(859): [appid=dictionary word=WORD2 frequency=255 locale=en, appid=dictionary word=WORD2 frequency=255 locale=en] 
02-22 12:33:51.070: I/log(859): appid=dictionary word=WORD2 frequency=255 locale=en 
02-22 12:33:51.070: I/log(859): appid=dictionary word=WORD2 frequency=255 locale=en 

顯然我在向數組中添加值時做了一些不正確的事情。誰能幫我? 感謝

+0

爲什麼你想要轉換爲數組呢?只需使用* mValueList * ... – m0skit0 2012-02-22 12:51:06

+0

轉換爲數組是因爲bulkInsert不接受arrayList。謝謝@ m0skit0 – user1094747 2012-02-23 10:22:06

回答

7

您正在修改同一個對象。這應該很好地工作:

public void mClick(View v){ 

     int batchSize = 25; 
     ContentValues[] mValueArray = new ContentValues[batchSize]; 
     List<ContentValues>mValueList = new ArrayList<ContentValues>(); 
     ContentValues mNewValues = new ContentValues(); 

     mNewValues.put(UserDictionary.Words.APP_ID, this.getPackageName()); 
     mNewValues.put(UserDictionary.Words.LOCALE, "en"); 
     mNewValues.put(UserDictionary.Words.FREQUENCY, "255"); 
     mNewValues.put(UserDictionary.Words.WORD, "WORD1"); 

     mValueList.add(mNewValues); 

     mNewValues = new ContentValues(); 
     mNewValues.put(UserDictionary.Words.APP_ID, this.getPackageName()); 
     mNewValues.put(UserDictionary.Words.LOCALE, "en"); 
     mNewValues.put(UserDictionary.Words.FREQUENCY, "255"); 
     mNewValues.put(UserDictionary.Words.WORD, "WORD2"); 

     mValueList.add(mNewValues); 

     mValueArray = new ContentValues[mValueList.size()]; 
     mValueList.toArray(mValueArray); 

     Log.i(TAG,mValueList.toString()); 
     Log.i(TAG,mValueArray[0].toString()); 
     Log.i(TAG,mValueArray[1].toString()); 


    } 

的,爲什麼你的代碼不能正常工作更多的解釋了一下:當您使用的add(),你保存在列表中的對象參考(指針)。它不會複製對象。當您稍後修改同一個對象時,列表中的參考仍指向此對象,因此您也正在修改該對象。對於同一個對象只有2個引用。

4

的問題是,你只需要一個單一的ContentValues對象:

 ContentValues mNewValues = new ContentValues(); 

,你把它添加到列表中的兩倍。這條線:

 mNewValues.put(UserDictionary.Words.WORD, "WORD2"); 

修改該對象;即使它在第一次將對象添加到列表之後出現,但您仍然可以在列表中看到它,因爲它仍然是同一個對象。

爲了解決這個問題,按照此:

 mValueList.add(mNewValues); 

與此:

 mNewValues = new ContentValues(); 

獲得實例來補充。

+0

感謝您的回答和解釋。 – user1094747 2012-02-23 10:22:13

相關問題