2012-02-22 58 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

相关问题