1

Я хочу удалить первый элемент в своем контент-провайдере. Я пытаюсь сделать это, удалив строку с id 0 (как показано ниже). Это не работает - приложение не будет работать с этим кодом.Удаление из ContentProvider?

public void onClickDeleteExercise(View view){ 
    int ret_val = getContentResolver().delete(MyProvider.CONTENT_URI, MyProvider.id+ " = ? ", new String[]{"0"}); 
    Toast.makeText(getBaseContext(), "First exercise deleted", Toast.LENGTH_LONG).show(); 
} 

Мой провайдер определил следующие:

static final String PROVIDER_NAME = "com.example.contentproviderexample.MyProvider"; 
static final String URL = "content://" + PROVIDER_NAME + "/cte"; 
static final Uri CONTENT_URI = Uri.parse(URL); 

static final String id = "id"; 
static final String name = "name"; 
static final int uriCode = 1; 

Как будет идти об удалении от этого? Спасибо!!

ответ

3

приложение:

getContentResolver().delete(Provider.CONTENT_URI,Provider._ID + "=" + id, null); 

Поставщик:

public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/") 

public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_URI, 
     ENTRIES_TABLE_NAME); 

public static final String _ID = "_id"; 

@Override 
public int delete(Uri uri, String where, String[] whereArgs) { 
    database.delete(ENTRIES_TABLE_NAME, where, whereArgs); 
    return 0; 
} 

подсказка:

  • исключить ошибки, если и использовать андроид студии сделать точку останова на

    public int delete(..) { 
        database.delete() <= here breakpoint 
    } 
    

и посмотреть, если после выполнения в приложении getContentResolver() отладчик будет двигать вас к этой точке останова

  • , если он не у не зарегистрированы поставщика правильно
  • контента, если и ударит точки останова реализации базы данных .delete является incorect

Если я хочу удалить первый элемент, я бы просто установить идентификатор равным 0?

зависит, если ваш _id является primary_key в таблице

  • баз SQlite двигатель имеет механизм, который создает уникальный ROWID для каждой новой строки при вставке.
  • , если таблица имеет primary_key то, в конечном счете становится псевдонимом для этого ROW_ID

    class SQLiteDatabase 
    
    /** 
    * Convenience method for deleting rows in the database. 
    * 
    * @param table the table to delete from 
    * @param whereClause the optional WHERE clause to apply when deleting. 
    *   Passing null will delete all rows. 
    * @param whereArgs You may include ?s in the where clause, which 
    *   will be replaced by the values from whereArgs. The values 
    *   will be bound as Strings. 
    * @return the number of rows affected if a whereClause is passed in, 0 
    *   otherwise. To remove all rows and get a count pass "1" as the 
    *   whereClause. 
    */ 
    public int delete(String table, String whereClause, String[] whereArgs) {} 
    

так па ид, как ИНТ и нужно:

database.delete(TABLE_NAME, KEY_ID + " = ?",new String[]{Long.toString(id)}); 

или просто:

String[] whereArgs = new String[] {String.valueOf(rowId)}; 

Внимание: ROWIDs будет изменение когда дб пылесосят

Поэтому, пожалуйста, будьте особенно осторожны при определении таблицы и нужно ссылаться на записи с помощью ROWID'ы тех.

Из официальной документации:

«ROWIDs может измениться в любое время и без предварительного уведомления. Если вам нужно зависеть от вашего rowid, сделайте его INTEGER PRIMARY KEY, тогда он не будет меняться ».

  • добавить также AUTOINCREMENT, так что вы уверены, что тот же ROWID (s) не используется повторно, когда строки удаляются.

В одном из моих таблиц sqlite3 table

Я получил ключ MESSAGE_ID и она начинает с значение = 1

  • Если и не уверены в использовании Key Value на Android устройстве SQLIte Debugger очень отличное приложение
+0

Если я хочу удалить ель st, я бы просто установил id на 0? – user3293643

+0

@ user3293643 u вам нужно посмотреть, что такое первичный ключ таблицы yr, см. Мое обновление – ceph3us