对SQLite进行插入或更新,以处理空表

时间:2014-10-02 17:49:43

标签: android android-sqlite

逻辑必须决定它是insert还是update表,但是它必须检查表是否为空。

所以当前版本的代码看起来像这样

if ((new XYZController(mContext)).getCount() == 0) {
    new XYZController(mContext).insert(object);
} else {
    XYZObject obj = (new XYZController(mContext)).getByString(string);
    if (obj == null) {
        new XYZController(mContext).insert(object);
    } else {
        new XYZController(mContext).update(object);
    }
}

由于我无法对空SQLite表进行WHERE查询,因此我必须添加"如果为空"检查。

有没有办法省略这样的流量,如果表格是空的,只需要进行1次插入和1次更新吗?

PS。如果我们尝试在空表上进行WHERE查询,则应用会在cursor.getString()

上中断
public XYZModel getByString(String s) {
    String selectQuery = "SELECT * FROM " + TABLE_XYZ
            + " WHERE " + COLUMN + "='" + s + "'";
    Cursor cursor = getRow(selectQuery);

    XYZModel walk = null;
    if (cursor != null) {
        cursor.moveToFirst();
        obj = new XYZModel(cursor.getString(1), cursor.getString(2),
                cursor.getString(3));
    }
    if (obj == null)
        obj = new XYZModel();

    return obj;
}

1 个答案:

答案 0 :(得分:3)

  1. 确保您的表具有合理的唯一性约束,例如某些列上的PRIMARY KEYUNIQUE约束

  2. 只需使用带有冲突解决算法的插入,例如替换,例如:

    db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
    
  3. 如果插入违反约束,则首先将删除冲突的行,然后插入新行。因此,请确保为每列提供值。

    如果您有数据库生成的INTEGER PRIMARY KEY,您最初可以为其值(NULL)提供ContentValues.putNull(),然后捕获插入的返回值以获取生成的主键值。

    这样您就不需要(错误的)代码来检查行是否存在,也不需要单独的分支来进行插入和更新。