dav*_*ino 8 sqlite android exception-handling constraints insert
我在Android中有一个SQLite数据库,我使用a ContentProvider
来处理操作,这些操作被持久化到一个列中带有UNIQUE限定符的表.
问题:
但是,当我insert
将值复制到数据库中时,它本身并没有破坏我的代码,但它仍然会吞噬数千条SQLiteConstraintException
日志行,而对我的用户来说,只是感觉污染了日志,这是一些未经修改的东西.我试过捕获异常只是为了实验,但它仍然记录.
题:
那么,我该如何沉默那些日志行呢?这甚至可能吗?
请阅读下面的评论,以了解提问的原因.
错误:
时间列具有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)
Run Code Online (Sandbox Code Playgroud)
Mic*_*and 10
如果你可以制定或修改SQL自己,无论是对INSERT
还是初始CREATE TABLE
,你可以使用SQLite的冲突处理扩展.有两种方法可以做到这一点:
INSERT OR IGNORE
而不仅仅是INSERT
.您也可以使用OR REPLACE
,OR ABORT
或任何其他几种反应.ON CONFLICT IGNORE
为UNIQUE
约束指定子句.这将导致违反约束的插入或更新无声地执行任何操作.我发现使用INSERT OR IGNORE
/ INSERT OR REPLACE
处理重复数据的想法非常干净,特别是在并发环境中.它在数据库中检查一次重复 - 并避免首先检查存在的竞争条件(如果只有一个进程/线程正在访问数据库,则无可置疑).
但是,如果重复项是错误的结果(而不是重复的事件/操作,而您的代码没有明确地重复删除),那么这可能只是隐藏错误而不是修复它.然而,在我看来,缺乏明确的去除不是一个错误.因此,如果要修复重复项,请使用数据库; 如果真正的问题是它们是首先生成的(在实际应用程序级别,而不是数据库行级别),那么我可能会寻找那个问题.
归档时间: |
|
查看次数: |
2334 次 |
最近记录: |