使用Contentprovider

时间:2015-08-09 21:02:23

标签: android android-contentprovider android-contentresolver

我正在使用提供程序删除SQLiteOpenHelper表中的所有数据,假设我有5行,我删除了表中的数据,如果我再次填充表格,数据_ID列从6开始

SQLite TABLE

  final String HISTORY = "CREATE TABLE " + Contract.History.TABLE + " (" +
            Contract.History._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            Contract.History.ROW + " INTEGER NOT NULL, " +
            Contract.History.HISTORY_NAME + " TEXT NOT NULL " +
            " );";

在提供商中删除SNIPPET

 @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    final SQLiteDatabase db = database.getWritableDatabase();
    final int match = matcher.match(uri);
    int rowsDeleted;
    if ( null == selection ) selection = "1";
    switch (match) {

        case HISTORY:
            rowsDeleted = db.delete(
                    Contract.History.TABLE, selection, selectionArgs);
            break;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
    // Because a null deletes all rows
    if (rowsDeleted != 0) {
        getContext().getContentResolver().notifyChange(uri, null);
    }
    return rowsDeleted;
}

我如何删除

 ContentResolver resolver = getContentResolver();
      resolver.delete(Contract.Running.CONTENT_URI,null,null);
    }

1 个答案:

答案 0 :(得分:0)

这是一种常规的数据库行为,它不是代码或查询中的错误,而是SQLite的工作方式。 SQLite网站声明:

  

SQLite跟踪表所持有的最大ROWID   使用名为" sqlite_sequence"的内部表。 sqlite_sequence   每当普通表时,都会自动创建和初始化表   包含AUTOINCREMENT列的创建。的内容   可以使用普通的UPDATE,INSERT修改sqlite_sequence表,   和DELETE语句。但是对这个表进行修改会   可能扰乱AUTOINCREMENT密钥生成算法。确保   在你做出这些改变之前,你知道自己在做什么。

我建议不要改变,除非你真的知道你在做什么。但如果你想要,你可以这样做:

DELETE FROM sqlite_sequence WHERE name = '<YOUR_TABLE>';

如果只删除某些行,也可以更新音序器。

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<YOUR_TABLE>'