Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对SQLite进行插入或更新,处理空表_Android_Android Sqlite - Fatal编程技术网

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

Android 对SQLite进行插入或更新,处理空表,android,android-sqlite,Android,Android Sqlite,逻辑必须决定是插入表还是更新表,但必须检查表是否为空 因此,代码的当前版本如下所示 if ((new XYZController(mContext)).getCount() == 0) { new XYZController(mContext).insert(object); } else { XYZObject obj = (new XYZController(mContext)).getByString(string); if (obj == null) {

逻辑必须决定是插入表还是更新表,但必须检查表是否为空

因此,代码的当前版本如下所示

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
查询,所以我必须进行额外的“if empty”检查

有没有一种方法可以忽略这样的流,只进行1次插入和1次更新,而不管表是否为空

另外,如果我们试图对空表进行
WHERE
查询,应用程序将在
游标上中断。getString()

  • 确保表具有合理的唯一性约束,例如某些列上的
    主键
    唯一性
    约束

  • 只需将insert与冲突解决算法(如replace)一起使用,例如:

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

    如果您有一个生成的数据库
    整数主键
    ,您可以首先为其值(
    ContentValues.putNull()
    )提供一个
    NULL
    ,然后捕获插入的返回值以获取生成的主键值

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

  • 确保表具有合理的唯一性约束,例如某些列上的
    主键
    唯一性
    约束

  • 只需将insert与冲突解决算法(如replace)一起使用,例如:

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

    如果您有一个生成的数据库
    整数主键
    ,您可以首先为其值(
    ContentValues.putNull()
    )提供一个
    NULL
    ,然后捕获插入的返回值以获取生成的主键值

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

  • 确保表具有合理的唯一性约束,例如某些列上的
    主键
    唯一性
    约束

  • 只需将insert与冲突解决算法(如replace)一起使用,例如:

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

    如果您有一个生成的数据库
    整数主键
    ,您可以首先为其值(
    ContentValues.putNull()
    )提供一个
    NULL
    ,然后捕获插入的返回值以获取生成的主键值

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

  • 确保表具有合理的唯一性约束,例如某些列上的
    主键
    唯一性
    约束

  • 只需将insert与冲突解决算法(如replace)一起使用,例如:

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

    如果您有一个生成的数据库
    整数主键
    ,您可以首先为其值(
    ContentValues.putNull()
    )提供一个
    NULL
    ,然后捕获插入的返回值以获取生成的主键值



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

    您只需使用
    替换为
    。如果记录存在,它将被替换,如果不存在,它将被插入。您需要通过
    execSQL()
    REPLACE-to
    运行它,它也称为
    INSERT或REPLACE
    。如果要保留现有行(如果该行通过其主键存在),则还有插入或忽略。因为我不能在空的SQLite表上执行WHERE查询,所以我必须进行额外的“if empty”检查——嗯
    WHERE
    将为空表返回零行,就像它将为非空表返回零行,但与
    WHERE
    子句不匹配一样。“如果我们尝试对空表进行WHERE查询,应用程序将在光标上中断。getString()--这是因为您看不到您的
    光标是否有任何行。@commonware谢谢。我修复了一个检查0行的光标。我的问题是,我是否应该完全停止使用SQLite中的
    UPDATE
    并切换到
    INSERT或REPLACE
    ?“我的问题是,我是否应该完全停止使用SQLite中的UPDATE并切换到INSERT或REPLACE?”--我无法回答这个问题,因为我不知道您的业务规则
    insertWithOnConflict()
    基本上是
    insert()
    的一种风格,它允许相同类型的冲突解决,因此您可以使用公认的答案,如果这是您的意思的话。但是正确的冲突解决策略是什么(忽略、替换等)取决于您。您只需使用
    替换为
    。如果记录存在,它将被替换,如果不存在,它将被插入。您需要通过
    execSQL()
    REPLACE-to
    运行它,它也称为
    INSERT或REPLACE
    。如果要保留现有行(如果该行通过其主键存在),则还有插入或忽略。因为我不能在空的SQLite表上执行WHERE查询,所以我必须添加“if empty”