ContentValues数组中的重复ContentValues

时间:2012-02-22 12:45:27

标签: android database arrays android-contentprovider

对此有任何帮助,确定它很简单但看不到它。

对内容提供程序(UserDictionary)执行bulkInsert,但所有插入都具有相同的“word”值。问题是Array of 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());


    }

并且从log中可以看到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 个答案:

答案 0 :(得分:8)

您正在修改同一个对象。这应该可以正常工作:

 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()时,你将引用(指针)保存在< em>列表。它不会复制对象。稍后修改同一个对象时, List 中的引用仍然指向此引用,因此您也要修改该引用。您只有2个引用同一个对象。

答案 1 :(得分:4)

问题是你只有一个ContentValues对象:

        ContentValues mNewValues = new ContentValues();

然后将其添加到列表中两次。这一行:

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

修改该对象;即使它是在你第一次将对象添加到列表之后,你仍然会在列表中看到它,因为它仍然是同一个对象。

要解决此问题,请按以下步骤操作:

        mValueList.add(mNewValues);

用这个:

        mNewValues = new ContentValues();

要添加实例。