2012-08-13 243 views
1

我曾与ContentProviders在以前的项目工作,这一直为我工作,但是我不能让我的头周围的问题这一次。当我使用Content Resolver运行update()时,它会复制数据库中的对象而不是更新它。的Android ContentResolver.update()产生重复

这里是代码更新。它仅在ContentValues中包含所需的更新数据,而不是整个对象的重复。 where语句中的索引变量是数据库中对象的行号,该索引是正确的。

ContentValues cv = new ContentValues(); 
cv.put(MessageProvider.KEY_MESSAGE_STATUS, m.getStatus()); 
cr.update(MessageProvider.CONTENT_URI_MESSAGE, cv, MessageProvider.KEY_ID + "=" + index, null); 

我不相信这个代码是有过错,因为我试图改变这一点,但它仍然会产生相同的重复。我的选择是在Uri中加入行索引。

这是内容提供者的代码。

@Override 
public int update(Uri uri, ContentValues values, String where, 
     String[] whereArgs) { 

    int count = 0; 
    String whereString; 

    switch (uriMatcher.match(uri)) { 
    case MESSAGE: 
     count = messageDB.update(MESSAGE_TABLE, values, where, whereArgs); 
     break; 

    case MESSAGE_ID_: 
     String segment = uri.getPathSegments().get(1); 

     if (!TextUtils.isEmpty(where)) { 
      whereString = " AND (" + where + ')'; 
     } else { 
      whereString = ""; 
     } 

     count = messageDB.update(MESSAGE_TABLE, values, KEY_ID + "=" 
       + segment + whereString, whereArgs); 
     break; 

    default: throw new IllegalArgumentException("Unsupported URI " + uri); 

    } 

    getContext().getContentResolver().notifyChange(uri, null); 
    return count; 
} 

没有在我这里跳出来,因为是不正确的,但我相信更多专家的眼睛能够帮助!非常感谢!这使我心灵的顶部

+2

你的代码似乎不错。你是否检查cr.update()返回的值是否为1,以及是否调用了一次? – SteveR 2012-08-15 14:58:51

+0

代码中的messageDB是什么?它是一个URI吗? – 2013-11-22 18:38:28

回答

1

感谢您的回复,非常感谢!

在深入到代码和调试后,它会出现约是好的,因为我已经说了我认为这方法的代码。这个问题与内容提供者无关,这是服务器后端的错误,包括对应用程序的响应中的错误数据。

感谢发布的想法。教训我:不要离开调试,直到你有一个解决方案,即使它需要几天时间......

1

事情是。

您是否已经验证的where子句是正确的,它指向的是实际存在的记录。

又是如何当你有一个地方,其实并不存在子句messageDB.update处理?

自己还没有与ContentProviders一起工作。但这似乎是一个可能的错误来源。