Android Sqlite 事务和内容提供程序

标签 android database sqlite android-contentprovider android-sqlite

我正在解析 JSON WebService 并创建一个包含数据的数组,以在数据库中插入和删除条目。

我找到了使用内容提供程序内的数据库事务插入多行的解决方案bulkInsert,但是,我正在尝试执行相同的过程来删除多行。

插入解决方案:

@Override
public int bulkInsert(Uri uri, ContentValues[] allValues) {

    SQLiteDatabase sqlDB = mCustomerDB.getWritableDatabase();

    int numInserted = 0;
    String table = MyDatabase.TABLE;

    sqlDB.beginTransaction();

    try {
        for (ContentValues cv : allValues) {
            //long newID = sqlDB.insertOrThrow(table, null, cv);
            long newID = sqlDB.insertWithOnConflict(table, null, cv, SQLiteDatabase.CONFLICT_REPLACE);
            if (newID <= 0) {
                throw new SQLException("Error to add: " + uri);
            }
        }
        sqlDB.setTransactionSuccessful();
        getContext().getContentResolver().notifyChange(uri, null);
        numInserted = allValues.length;
    } finally {
        sqlDB.endTransaction();
    }

    return numInserted;
}

使用此调用:

mContext.getContentResolver().bulkInsert(ProviderMyDatabase.CONTENT_URI, valuesToInsertArray);

有没有办法使用内容提供程序删除数据库的多行(具有此数组 ID)。

更新:

我使用 `IN 子句找到了这个解决方案:

List<String> list = new ArrayList<String>();

for (ContentValues cv : valuesToDelete) {
    Object value = cv.get(DatabaseMyDatabase.KEY_ROW_ID);
    list.add(value.toString());
}

String[] args = list.toArray(new String[list.size()]);
String selection = DatabaseMyDatabase.KEY_ROW_ID + " IN(" + new String(new char[args.length-1]).replace("\0", "?,") + "?)";

int total = mContext.getContentResolver().delete(ProviderMyDatabase.CONTENT_URI, selection, args);
LOGD(TAG, "Total = " + total);

问题是,如果 JSON 返回超过 1000 行要插入,则会发生错误,因为 SQLITE_MAX_VARIABLE_NUMBER 设置为 999。它可以更改,但只能在编译时更改。

ERROR: SQLiteException: too many SQL variables

提前致谢

最佳答案

我用这段代码解决了这个问题:

if (!valuesToDelete.isEmpty()) {

        StringBuilder sb = new StringBuilder();
        String value = null;

        for (ContentValues cv : valuesToDelete) {

            value = cv.getAsString(kei_id);

            if (sb.length() > 0) {
                sb.append(", ");
            }
            sb.append(value);
        }

        String args = sb.toString();

        String selection = kei_id + " IN(" + args + ")";

        int total = mContext.getContentResolver().delete(uri, selection, null);
        LOGD(TAG, "Total = " + total);


    } else {
        LOGD(TAG, "No data to Delete");
    }

谢谢

关于Android Sqlite 事务和内容提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323849/

相关文章:

c# linq 更新数据库中的所有记录

ios - 来自现有 SQLite 数据库的核心数据数据模式

c# - SQLite 使用用户输入选择查询 C#

android - 使用 Android Youtube API 播放直播流

java - 为什么 Calendar.getInstance() 和 getDate() 方法无法按预期工作?无法检索日期

SQL 全文搜索与 "LIKE"

python - 使用 PyODBC、Python 连接到 SQLite3 服务器

Android MenuItemCompat.getActionView 已弃用

java - 24 小时倒计时器,具有小时、分钟、秒三个独立的 TextView

c# - ExecuteScalar 调用抛出异常 "Object reference not set to an instance of an object"