2011-07-25 42 views
0

我正在解析一个xml,解析完这个xml后,我将这些记录存储在数据库中。我使用SQLite作为数据库。我的数据是以幻灯片的形式在XML中。当我存储在数据库中的一些幻灯片,我得到重复的条目。例如,如果我的xml包含3张幻灯片,则在数据库6中存储有不同的项目标识,因此每张幻灯片都会保存2次。这是我在做什么在数据库中获取重复条目

ArrayList<SlideShowItem>slideItems=Utils.database.getSlideItemOfUrl(Constants.StoriesTable,tempSlideShow.getFullStoryUrl().substring(0, index - 1), type); 

          if (slideItems == null) { 
           Log.d("store in DB: ", " when SlideItems == null "); 

           Log.d("SlideShow Title: ", tempSlideShow.getTitle()); 
           Log.d("SlideShow pub Date: ", tempSlideShow.getPubDate()); 
           Utils.database.storeSlideItem(Constants.StoriesTable, myUrl, tempSlideShow.getSlideShow(), null); 
           //Utils.topStorySlidesArrayList = slideItems; 

          } else { 
           //Log.d("SlideShow Title: ", tempSlideShow.getTitle()); 
           Log.d("Already in DB ", " when SlideItems is not null "); 
           Utils.topStorySlidesArrayList = slideItems; 

          } 

请任何帮助apprecitaed。我想我正在把一些检查错误。请在这方面帮助我。

Utils.database.storeSlideItem包含此代码:

public synchronized void storeSlideItem(String tableName, String url, ArrayList<SlideShowItem> list, String type) { 

    System.out.println("size of the Array list: " + list.size()); 

    String newType = null; 
    if (type == null) { 
     newType = "List"; 
    }else{ 
     newType = type; 
    }  

    try { 
     for (int i = 0; i < list.size(); i++) { 
      SlideShowItem item = list.get(i); 
      String itemUrl = url + i;// Unique URL for the DB; 
      String imgString = null; 
      Drawable drawable = item.getImage(); 
      if (item.getBody() != null) { 
       item.setBody(item.getBody().replace('\'', '`')); 
       // replace as it create syntax error for storing data 
      } 
      if (item.getSubTitle() != null) { 
       item.setSubTitle(item.getSubTitle().replace('\'', '`')); 
      } 

      if (drawable != null) { 
       Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 

       byte[] b = baos.toByteArray(); 
       imgString = Base64.encodeBytes(b); 
      } 

      if (isOpen()) { 
       myDB.execSQL("INSERT INTO " + tableName + "(" + column[1] + "," + column[2] + "," + column[3] + "," + column[4] + "," + column[6] 
         + "," + column[7] + ",type) VALUES('" + itemUrl + "','" + item.getSubTitle() + "','" + item.getBody() + "','" 
         + item.getImagePath() + "','" + item.getIndex() + "','" + imgString + "','" + newType + "Slide')"); 
       if (item.getBody() != null) { 
        item.setBody(item.getBody().replace('`', '\''));// " ' " 
        // replace as it create syntax error for storing data 
       } 
       if (item.getSubTitle() != null) { 
        item.setSubTitle(item.getSubTitle().replace('`', '\'')); 
       } 

       if (tableName.equals(Constants.StoriesTable)) { 
        item.setItemId(getItemID(tableName, itemUrl)); 
        Utils.hashListStoriesIds.put(itemUrl, item.getItemId()); 

        if (imgString != null) { 
         Utils.hashListImages.put(item.getItemId(), new Boolean(true)); 
        } else { 
         Utils.hashListImages.put(item.getItemId(), new Boolean(false)); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     Log.e("Error", "Exception: storeSlideItem type " + e.toString()); 
    } finally { 
     closeConnection(); 
    } 

} 
+0

请显示您的'Utils.database.storeSlideItem'方法的代码。 – THelper

+0

@THelper我也提供了这个代码..现在看看你是否可以帮忙。 –

+0

我注意到你首先将东西存入你的数据库,然后改变一些项目的属性? (setBody,SetSubTitle,SetItemId)。不应该改变属性后保存到数据库? – THelper

回答

0

你有没有在您的作品有什么独特的ID字段?如果是这样,您可以在数据库模式中创建一个主键,这将强制所有条目不同,或者在添加副本时引发异常,以便追踪问题。

+0

是的,有一个主键,它是itemID,它是在运行时基于幻灯片的url生成的。 –

+0

是否在保存幻灯片或创建幻灯片时生成了itemID?你能否加载这个URL两次,因此创造了两倍的幻灯片。 如果您多次加载相同的URL,您会得到3个不同的itemID或3次相同的?如果你得到3个不同的,你可能需要添加另一种方法来生成它们,因此它们对于每个URL都是相同的。由于您在数据库上有主键,因此您的问题几乎肯定是幻灯片的意外重复。 – ScouseChris

+0

Xup这是偶然的,因为没有发生每个幻灯片。然而,itemId在保存到数据库之前被分配给一张幻灯片,并且有一个单独的方法可以这样做。 –