回答
如果我说得对,“忙”意味着你无法获得锁定。似乎有另一个进程(或线程等)对数据库有锁定。
如果你调用一个函数sqlite3的错误代码SQLITE_BUSY时,得到的结果,这意味着通过drdaeman观察到该数据库已通过相同的方法或通过您的工艺中的一个线程锁定。
处理这种情况的正确方法是在循环中尝试操作,并且如果返回码仍然是SQLITE_BUSY,要等待一段时间(您决定超时值),然后在下一次重试操作循环迭代。
例如,下面的代码片段从目标C包装FMDB采取(http://code.google.com/p/flycode/source/browse/trunk/fmdb)展示了如何准备语句的查询考虑到某些操作可能返回SQLITE_BUSY:
int numberOfRetries = 0;
BOOL retry = NO;
if (!pStmt) {
do {
retry = NO;
rc = sqlite3_prepare(db, [sql UTF8String], -1, &pStmt, 0);
if (SQLITE_BUSY == rc) {
retry = YES;
usleep(20);
if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]);
NSLog(@"Database busy");
sqlite3_finalize(pStmt);
[self setInUse:NO];
return nil;
}
}
else if (SQLITE_OK != rc) {
if (logsErrors) {
NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
NSLog(@"DB Query: %@", sql);
if (crashOnErrors) {
NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
}
}
sqlite3_finalize(pStmt);
[self setInUse:NO];
return nil;
}
}
while (retry);
}
由方式,如果您需要访问sqlite,FMDB非常方便,并且通过本机C API直接访问方面的使用非常简单。
只需调用[sqlite3_busy_timeout](http://www.sqlite.org/c3ref/busy_timeout.html)即可完成相同的工作。 – 2012-02-02 22:11:10
我在顺序INSERT INTO命令中遇到了与SQLITE_BUSY类似的问题。第一行插入正常,但当应用程序尝试插入第二行时,我得到了SQLITE_BUSY状态。在谷歌周围,我知道你必须在执行它们之后调用sqlite3_finalize()语句:http://www.sqlite.org/c3ref/finalize.html。完成我的陈述解决了我的问题。
就我而言,我忘记了在使用它后关闭数据库。继固定雷:
sqlite3_finalize(statement);
sqlite3_close(contactDB);
FMDB也可以从你轻松缓解这些头疼的问题。
就像管理员为我运行命令提示符一样简单。另外在UNIX上,你可以在启动数据库时使用sudo
。
- 1. Rails 3.1:Sqlite异常
- 2. 使用SQLite滴Laravel黄昏测试文件繁忙异常
- 3. sqlite的空指针异常
- 4. FluentNHibernate; SQLite的; FileNotFoundException异常(System.Data.SQLite)
- 5. 黑莓SQLite路径异常
- 6. Sqlite数据库Pragma异常?
- 7. WPF SQLite查询异常
- 8. Java异常错误 - Sqlite preparedStatement.setBlob
- 9. Sqlite异常,语法错误
- 10. Android SQLite异常表没有列
- 11. 异常亚音速2.2,SQLite和迁移
- 12. create table sentense中的sqlite异常
- 13. sqlite的异常处理的Android
- 14. 创建数据库时sqlite异常
- 15. Android SQLITE查询异常错误?
- 16. 的Android SQLite的异常接近“/”
- 17. Android的sqlite异常,如何解决?
- 18. SQLite的异常内存使用
- 19. 插入时得到sqlite异常?如何?
- 20. ActiveAndroid SQLite异常'没有这样的表'
- 21. SQLite的抛出异常与NH 3.2
- 22. Xamarin中的SQLite抛出连接异常
- 23. SQLite查询在Android中抛出异常
- 24. SQLite数据库查询异常处理
- 25. sqlite异常没有这样的列
- 26. 的ActiveRecord + SQLite的3行为异常
- 27. Android SQLite异常没有这样的列
- 28. 如何解决此sqlite异常约束
- 29. Android SQLite“没有这样的表”异常
- 30. Android SQLite数据库空指针异常
你能提供一些示例代码吗?几条线了解发生了什么。 – stefanB 2009-06-08 10:21:04