android - 可以依赖 SQLiteConstraint 并让 SQLite 为我进行检查吗?有陷阱吗?

标签 android sqlite exception-handling insert constraints

我在 Android 中有一个 SQLite 数据库,我使用 ContentProvider 来处理操作,这些操作被保存到一个列中带有 UNIQUE 限定符的表中。

问题:

但是,当我insert 重复的值到数据库中时,它本身并没有破坏我的代码,但它仍然吐出成千上万的SQLiteConstraintException 日志行,并且我的用户感觉就像在污染日志,一些未经修饰的东西。我 try catch 异常只是为了实验,但它仍然记录。

问题:

那么,如何让这些日志行静音?这可能吗?

请阅读下面的评论以了解提出问题的原因。

错误:

时间列有UNIQUE约束:

Error inserting Factor=2.0 Time=1325375465000 Extra=none
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
    at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
    at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
    at mypackage.myapp.provider.DataProvider.bulkInsert(DataProvider.java:353)
    at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:179)
    at android.content.ContentResolver.bulkInsert(ContentResolver.java:646)
    at mypackage.myapp.service.MyService.onHandleIntent(MyService.java:96)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.os.HandlerThread.run(HandlerThread.java:60)

最佳答案

如果您可以自己制定或修改 SQL,无论是对于 INSERT 还是对于初始的 CREATE TABLE,您都可以使用 SQLite 的 conflict handling extensions .如何执行此操作有两种选择:

  • 插入时,使用INSERT OR IGNORE 而不仅仅是INSERT。您还可以使用 OR REPLACEOR ABORT 或任何其他 react 。
  • 创建表时,为UNIQUE 约束指定一个ON CONFLICT IGNORE 子句。这将导致违反约束的插入或更新静默不做任何事情。

我发现使用INSERT OR IGNORE/INSERT OR REPLACE 处理重复数据的想法非常简洁,尤其是在并发环境中。它检查一次重复 - 在数据库中 - 并避免您首先检查是否存在的竞争条件(如果只有一个进程/线程正在访问数据库,这当然不是问题)。

但是,如果重复是错误的结果(而不是您的代码没有明确去重的重复事件/操作),那么这可能只是隐藏错误而不是修复它。然而,在我看来,缺乏明确的重复数据删除并不是一个错误。因此,如果解决方法是检查重复项,请使用数据库;如果真正的问题是它们首先生成(在实际的应用程序级别,而不是数据库行级别),那么我可能会查找该问题。

关于android - 可以依赖 SQLiteConstraint 并让 SQLite 为我进行检查吗?有陷阱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690682/

相关文章:

android - 下载的图像可以显示,但托管服务器保存的图像无法在 Android 中显示

android - 如何浏览文件并通过蓝牙将其发送到连接的设备?

c# - 通过 Adapter.Update 将 DataTable 保存到 SQLite 数据库

wcf - "Configuring Services with Endpoints"演示对我来说失败 (Microsoft/endpoint.tv/Pluralsight)

android - 将 Serializable 用作 Android 导航组件的深层链接参数

java - 如何解决具有许多对象和属性的 Json 数组响应?

python - 如何将csv文件中的数据插入sqlite db?

wpf - SQLite DateTime 与 VARCHAR 的比较

未捕获 PHP 异常

c# - AppDomain.UnhandledException 处理程序不会在单元测试中触发