2012-02-22 19 views
3

これは助けてもらえますか?それは簡単なことですが、それを見ることはできません。ContentValues内の重複したContentValues配列

コンテンツプロバイダ(UserDictionary)にbulkInsertを実行しているが、すべての挿入物に同じ「単語」値があります。問題は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 

明らかに、配列に値を追加すると間違ったことをしています。誰も私を助けることができますか?

 ContentValues mNewValues = new ContentValues(); 

とあなたが二回リストに追加: おかげ

+0

なぜ、配列に変換したいのですか? * mValueList * ... – m0skit0

+0

bulkInsertがarrayListを受け付けないため、配列に変換するだけです。ありがとう@ m0skit0 – user1094747

答えて

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()); 


    } 

あなたのコードが動作しない理由についての詳細な説明のビット:あなたはアドオン()を使用する場合、あなたはリスト内のオブジェクト参照(ポインタ)を保存しています。オブジェクトはコピーされません。後でその同じオブジェクトを変更すると、リストの参照はこの参照先を指しているので、同様にその参照を修正しています。同じオブジェクトに対して2つの参照があるだけです。

4

問題は、あなただけの単一ContentValuesのオブジェクトを持っているということです。この行:

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

このオブジェクトを変更します。初めてオブジェクトをリストに追加した後でも、それはまだ同じオブジェクトなので、リストにオブジェクトが表示されます。この問題を解決するには

、この従ってください:追加する新しいインスタンスを取得するために

 mNewValues = new ContentValues(); 

:これで

 mValueList.add(mNewValues); 

を。

+0

答えと説明をありがとう。 – user1094747

関連する問題