2012-03-29 3 views
2

arbeitet an einem Content-Provider und ich habe ein Problem damit. Wenn ich versuche, eine bestimmte Zeile in der SQLite-Datenbank über den Inhaltsanbieter zu aktualisieren, wird die Spalte in allen Zeilen aktualisiert, nicht nur in der von mir angegebenen Zeile. Ich weiß, dass der CP funktioniert, weil ich darauf zugreifen kann, füllen Sie eine Listview mit ihm und ändern Sie den Inhalt der Spalte, aber nie nur eine Spalte.Content Provider aktualisiert alle Zeilen

Hier ist die relevante Update-Methode

public int update(Uri url, ContentValues values, String where, 
      String[] whereArgs) { 
     SQLiteDatabase mDB = dbHelper.getWritableDatabase(); 
     int count; 
     String segment = ""; 
     switch (URL_MATCHER.match(url)) { 
     case ITEM: 
      count = mDB.update(TABLE_NAME, values, where, whereArgs); 
      break; 
     case ITEM__ID: 
      segment = url.getPathSegments().get(1); 
      count = mDB.update(TABLE_NAME, values, 
        "_id=" 
          + segment 
          + (!TextUtils.isEmpty(where) ? " AND (" + where 
            + ')' : ""), whereArgs); 
      break; 

     default: 
      throw new IllegalArgumentException("Unknown URL " + url); 
     } 
     getContext().getContentResolver().notifyChange(url, null); 
     return count; 
    } 

und hier ist der Code, den ich verwende (versuchen) zu aktualisieren.

ContentValues mUpdateValues = new ContentValues(); 

mUpdateValues.put(ContentProvider.HAS, "true"); 
mUpdateValues.put(ContentProvider.WANT, "false"); 

mRowsUpdated = getContentResolver().update(Uri.parse(ContentProvider._ID_FIELD_CONTENT_URI 
+ rowId), mUpdateValues, null, null); 

und hier die URI ist

URL_MATCHER.addURI(AUTHORITY, TABLE_NAME + "/#", ITEM__ID); 

Danke, jede mögliche Hilfe würde geschätzt.

EDIT Ich habe auch versucht,

mRowsUpdated = getContentResolver().update(
        ContentProvider._ID_FIELD_CONTENT_URI, mUpdateValues, 
        null, null); 

und

mRowsUpdated = getContentResolver().update(
        ContentProvider.CONTENT_URI, mUpdateValues, 
        null, null); 

Antwort

2

Sie spezifizieren nicht eine WHERE-Klausel, die ist, was verwendet wird, nur bestimmte Zeilen zu aktualisieren. Das Standardverhalten von Inhaltsanbietern besteht darin, alle Zeilen zu aktualisieren, sofern Sie keine Bedingungen angeben.

Aus der Dokumentation: developer.android.com/reference/android/content/ContentResolver.html

Parameters 
uri  The URI to modify. 
values The new field values. The key is the column name for the field. A null value will remove an existing field value. 
where A filter to apply to rows before updating, formatted as an SQL WHERE clause (excluding the WHERE itself). 
+0

Ich habe versucht 'rowId' verwendet, die eine Saite auf der _id des Datensatzes basiert auf aktualisieren. Ich habe es versucht, es zu einem 'langen' auch zu analysieren, wie in WHERE _id = 'rowId'' –

+0

Ok, hat es zur Arbeit, Seit du warst, war die einzige Antwort, und war im Wesentlichen richtig, mein 'WHERE' sehend Aussage war durcheinander, ich markiere deine als richtig. Vielen Dank. –

+1

@BillGary für die Vollständigkeit bitte aktualisieren Sie Ihre Frage mit Ihrer Lösung, die schließlich funktioniert. Danke. –