Дублированный ContentValues ​​в массиве ContentValues - PullRequest
3 голосов
/ 22 февраля 2012

Может ли помочь с этим, конечно, это что-то простое, но не вижу этого.

Выполнение массового вставки в контент-провайдер (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

Очевидно, что я делаю что-то неправильно с добавлением значений в массивы. Может кто-нибудь мне помочь? Спасибо

Ответы [ 2 ]

8 голосов
/ 22 февраля 2012

Вы модифицируете тот же объект.Это должно работать нормально:

 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 () , вы сохраняете ссылку на объект (указатель) в списке .Он не копирует объект.Когда вы позже модифицируете этот же объект, ссылка в List по-прежнему указывает на этот объект, и, таким образом, вы также модифицируете этот объект.У вас просто есть 2 ссылки на один и тот же объект.

4 голосов
/ 22 февраля 2012

Проблема в том, что у вас есть только один ContentValues объект:

        ContentValues mNewValues = new ContentValues();

и вы добавляете его в список дважды. Эта строка:

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

изменяет этот объект; даже если это происходит после того, как вы впервые добавили объект в список, вы все равно видите его в списке, потому что это все тот же объект.

Чтобы исправить это, выполните следующее:

        mValueList.add(mNewValues);

с этим:

        mNewValues = new ContentValues();

чтобы получить новый экземпляр для добавления.

...