- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在解决最常见的数据库锁定问题。
当我的应用程序运行时,会调用一个 API 来获取数据。然后将此数据插入到数据库表中。我在带有串行队列的后台线程中执行此操作。同时如果用户按下按钮切换到下一个屏幕,选择查询工作(在主线程上)以获取要显示的数据。这就是我遇到这个问题的意义所在。甚至应用程序有时也会崩溃。
我搜索过这个问题,但每次我看到有关“同步”或使用 FMDB 的教程的链接。
由于我的时间不多了,有人可以帮我提供一个简单而详细的解决方案吗?我还发布了用于插入和检索数据的代码。请注意检查我是否在某处出错。
-(void)insertIntoTable_VENUES_WithData:(NSArray*)dataArray{
sqlite3_stmt *statement = nil;
const char *dbpath = [_databasePath UTF8String];
if (sqlite3_open(dbpath, &_database) == SQLITE_OK) {
const char *sql = "INSERT OR REPLACE INTO venues (gig_date, start_time, doors_open, end_time, gig_title, main_artist, gig_type, promoter, band_members, venue, tel_no, postcode, img_url, ticket_price, booking_url, sold_out, venue_url, venue_biog, sync_flag) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setLocale:[[StaticHelper sharedObject] usLocale]];
if (sqlite3_prepare_v2(_database, sql, -1, &statement, NULL) == SQLITE_OK) {
for (int i=0; i<dataArray.count; i++) {
NSDictionary *dataDic = [NSDictionary dictionaryWithDictionary:[dataArray objectAtIndex:i]];
if (![[dataDic objectForKey:kGigDate] isEqual:[NSNull null]]){
NSString *dateStr = [dataDic objectForKey:kGigDate];
[dateFormat setDateFormat:@"dd/MM/yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormat dateFromString:dateStr];
NSDate *dateWithoutTime = [[StaticHelper sharedObject] getDateWithOutTime:dateFromString];
float dateToStore = [dateWithoutTime timeIntervalSince1970];
sqlite3_bind_double(statement, 1, dateToStore);
}
else
sqlite3_bind_null(statement,1);
if (![[dataDic objectForKey:kStartTime] isEqual:[NSNull null]])
sqlite3_bind_text(statement,2,[[dataDic objectForKey:kStartTime] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,2);
if (![[dataDic objectForKey:kDoorsOpen] isEqual:[NSNull null]])
sqlite3_bind_text(statement,3,[[dataDic objectForKey:kDoorsOpen] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,3);
if (![[dataDic objectForKey:kEndTime] isEqual:[NSNull null]])
sqlite3_bind_text(statement,4,[[dataDic objectForKey:kEndTime] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,4);
if (![[dataDic objectForKey:kGigTitle] isEqual:[NSNull null]])
sqlite3_bind_text(statement,5,[[dataDic objectForKey:kGigTitle] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,5);
if (![[dataDic objectForKey:kMainArtist] isEqual:[NSNull null]])
sqlite3_bind_text(statement,6,[[dataDic objectForKey:kMainArtist] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,6);
if (![[dataDic objectForKey:kGigType] isEqual:[NSNull null]])
sqlite3_bind_text(statement,7,[[dataDic objectForKey:kGigType] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,7);
if (![[dataDic objectForKey:kPromoter] isEqual:[NSNull null]])
sqlite3_bind_text(statement,8,[[dataDic objectForKey:kPromoter] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,8);
if (![[dataDic objectForKey:kBandMembers] isEqual:[NSNull null]])
sqlite3_bind_text(statement,9,[[dataDic objectForKey:kBandMembers] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,9);
if (![[dataDic objectForKey:kVenue] isEqual:[NSNull null]])
sqlite3_bind_text(statement,10,[[dataDic objectForKey:kVenue] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,10);
if (![[dataDic objectForKey:kTelNo] isEqual:[NSNull null]])
sqlite3_bind_text(statement,11,[[dataDic objectForKey:kTelNo] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,11);
if (![[dataDic objectForKey:kPostCode] isEqual:[NSNull null]])
sqlite3_bind_text(statement,12,[[dataDic objectForKey:kPostCode] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,12);
if (![[dataDic objectForKey:kImgUrl] isEqual:[NSNull null]])
sqlite3_bind_text(statement,13,[[dataDic objectForKey:kImgUrl] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,13);
if (![[dataDic objectForKey:kTicketPrice] isEqual:[NSNull null]])
sqlite3_bind_text(statement,14,[[dataDic objectForKey:kTicketPrice] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,14);
if (![[dataDic objectForKey:kBookingUrl] isEqual:[NSNull null]])
sqlite3_bind_text(statement,15,[[dataDic objectForKey:kBookingUrl] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,15);
if (![[dataDic objectForKey:kSoldOut] isEqual:[NSNull null]])
sqlite3_bind_text(statement,16,[[dataDic objectForKey:kSoldOut] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,16);
if (![[dataDic objectForKey:kVenueUrl] isEqual:[NSNull null]])
sqlite3_bind_text(statement,17,[[dataDic objectForKey:kVenueUrl] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,17);
if (![[dataDic objectForKey:kVenueBlog] isEqual:[NSNull null]])
sqlite3_bind_text(statement,18,[[dataDic objectForKey:kVenueBlog] UTF8String],-1,SQLITE_TRANSIENT);
else
sqlite3_bind_null(statement,18);
sqlite3_bind_int(statement, 19, 0);////
if (sqlite3_step(statement) != SQLITE_DONE) {
NSLog(@"SQL execution failed in ZADDED_FOOD_ITEMS: %s", sqlite3_errmsg(_database));
}
if (sqlite3_step(statement) == SQLITE_DONE) {
if (i == (dataArray.count - 1))
sqlite3_finalize(statement);
}else{
sqlite3_reset(statement);
NSLog(@"SQL execution failed: %s", sqlite3_errmsg(_database));
}
}//for
sqlite3_finalize(statement);
}else{
NSLog(@"Row insertion error(error in prepare!)");
}
sqlite3_finalize(statement);//finalize is to sqlite3_prepare_v2 as close is to sqlite3_open
sqlite3_close(_database);;
}else{
NSLog(@"error in opening db");
}
-(NSMutableArray *)getDataFromTable_VENUES_WhereGigDateIsEqualTo:(NSDate*)gigDate
{
NSDate *dateWithoutTime = [[StaticHelper sharedObject] getDateWithOutTime:gigDate];
NSTimeInterval dateInterval = [dateWithoutTime timeIntervalSince1970] ;
NSInteger intDateInterval = dateInterval;
const char *dbpath = [_databasePath UTF8String];
NSMutableArray *queryResult = [NSMutableArray array];
sqlite3_stmt *statement = nil;
NSMutableDictionary *dic;
if (sqlite3_open(dbpath, &_database) == SQLITE_OK)
{
NSString *query = [NSString stringWithFormat:@" SELECT * FROM %@ WHERE %@='%ld' AND %@=1 ORDER BY %@ ASC ",kVenues, kGigDate, intDateInterval, kSyncFlag, kStartTime];
if(sqlite3_prepare_v2(_database,[query UTF8String],-1,&statement,NULL)==SQLITE_OK)
{
while (sqlite3_step(statement)<=SQLITE_ROW)
{
dic = [NSMutableDictionary dictionary];
float dbDataAsDouble0 = sqlite3_column_double(statement, 0);
NSDate *dateRetrieved = [NSDate dateWithTimeIntervalSince1970:dbDataAsDouble0];
NSString *strDate = [[StaticHelper sharedObject] getStringFromDate:dateRetrieved];
//char *dbDataAsChars0 = (char*)sqlite3_column_text(statement, 0);
if (strDate != nil)
[dic setObject:strDate forKey:kGigDate];
else{
[dic setObject:@"" forKey:kGigDate];
}
char *dbDataAsChars1 = (char*)sqlite3_column_text(statement, 1);
if (dbDataAsChars1 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars1] forKey:kStartTime];
else{
[dic setObject:@"" forKey:kStartTime];
}
char *dbDataAsChars2 = (char*)sqlite3_column_text(statement, 2);
if (dbDataAsChars2 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars2] forKey:kDoorsOpen];
else{
[dic setObject:@"" forKey:kDoorsOpen];
}
char *dbDataAsChars3 = (char*)sqlite3_column_text(statement, 3);
if (dbDataAsChars3 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars3] forKey:kEndTime];
else{
[dic setObject:@"" forKey:kEndTime];
}
char *dbDataAsChars4 = (char*)sqlite3_column_text(statement, 4);
if (dbDataAsChars4 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars4] forKey:kGigTitle];
else{
[dic setObject:@"" forKey:kGigTitle];
}
char *dbDataAsChars5 = (char*)sqlite3_column_text(statement, 5);
if (dbDataAsChars5 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars5] forKey:kMainArtist];
else{
[dic setObject:@"" forKey:kMainArtist];
}
char *dbDataAsChars6 = (char*)sqlite3_column_text(statement, 6);
if (dbDataAsChars6 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars6] forKey:kGigType];
else{
[dic setObject:@"" forKey:kGigType];
}
char *dbDataAsChars7 = (char*)sqlite3_column_text(statement, 7);
if (dbDataAsChars7 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars7] forKey:kPromoter];
else{
[dic setObject:@"" forKey:kPromoter];
}
char *dbDataAsChars8 = (char*)sqlite3_column_text(statement, 8);
if (dbDataAsChars8 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars8] forKey:kBandMembers];
else{
[dic setObject:@"" forKey:kBandMembers];
}
char *dbDataAsChars9 = (char*)sqlite3_column_text(statement, 9);
if (dbDataAsChars9 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars9] forKey:kVenue];
else{
[dic setObject:@"" forKey:kVenue];
}
char *dbDataAsChars10 = (char*)sqlite3_column_text(statement, 10);
if (dbDataAsChars10 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars10] forKey:kTelNo];
else{
[dic setObject:@"" forKey:kTelNo];
}
char *dbDataAsChars11 = (char*)sqlite3_column_text(statement, 11);
if (dbDataAsChars11 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars11] forKey:kPostCode];
else{
[dic setObject:@"" forKey:kPostCode];
}
char *dbDataAsChars12 = (char*)sqlite3_column_text(statement, 12);
if (dbDataAsChars12 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars12] forKey:kImgUrl];
else{
[dic setObject:@"" forKey:kImgUrl];
}
char *dbDataAsChars13 = (char*)sqlite3_column_text(statement, 13);
if (dbDataAsChars13 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars13] forKey:kTicketPrice];
else{
[dic setObject:@"" forKey:kTicketPrice];
}
char *dbDataAsChars14 = (char*)sqlite3_column_text(statement, 14);
if (dbDataAsChars14 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars14] forKey:kBookingUrl];
else{
[dic setObject:@"" forKey:kBookingUrl];
}
char *dbDataAsChars15 = (char*)sqlite3_column_text(statement, 15);
if (dbDataAsChars15 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars15] forKey:kSoldOut];
else{
[dic setObject:@"" forKey:kSoldOut];
}
char *dbDataAsChars16 = (char*)sqlite3_column_text(statement, 16);
if (dbDataAsChars16 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars16] forKey:kVenueUrl];
else{
[dic setObject:@"" forKey:kVenueUrl];
}
char *dbDataAsChars17 = (char*)sqlite3_column_text(statement, 17);
if (dbDataAsChars17 != NULL)
[dic setObject:[NSString stringWithUTF8String:dbDataAsChars17] forKey:kVenueBlog];
else{
[dic setObject:@"" forKey:kVenueBlog];
}
[queryResult addObject:dic];
}
sqlite3_finalize(statement);
}
else{
////NSLog(@"Error msg : %s ", sqlite3_errmsg(_database));
return nil;
}
sqlite3_close(_database);
}
else{
NSLog(@"database not open : %s",sqlite3_errmsg(_database));
}
return queryResult;
最佳答案
如果数据库已经打开并被某个线程进程锁定,当您尝试打开它时会出现此错误(Try to open locked database)
在您的 getDataFromTable_VENUES_WhereGigDateIsEqualTo
方法中,检查以下内容:
else{
////NSLog(@"Error msg : %s ", sqlite3_errmsg(_database));
return nil;
}
在这里,您无需使用
解锁打开的数据库即可返回sqlite3_close(_database);
返回这里之前关闭数据库。还要检查代码中其他地方是否存在类似问题。
else{
sqlite3_close(_database);
////NSLog(@"Error msg : %s ", sqlite3_errmsg(_database));
return nil;
}
为避免类似错误,创建用于处理数据库函数的类并创建它的共享实例。
#import <Foundation/Foundation.h>
#import <sqlite3.h>
@interface DBManager : NSObject
{
NSString *databasePath;
}
+(DBManager*)getSharedInstance;
@end
#import "DBManager.h"
static DBManager *sharedInstance = nil;
static sqlite3 *database = nil;
static sqlite3_stmt *statement = nil;
@implementation DBManager
+(DBManager*)getSharedInstance{
if (!sharedInstance) {
sharedInstance = [[super allocWithZone:NULL]init];
[sharedInstance openDB];
}
return sharedInstance;
}
-(BOOL)openDB{
//打开数据库的代码,赋值给database
,返回状态
}
关于ios - 如何避免 'database is locked' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017876/
我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。 我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。当我们对模型进行更改(添加属性)时,
我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。 我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。当我们对模型进行更改(添加属性)时,
我希望将一些信息分发到不同的机器上,以便在没有任何网络开销的情况下实现高效和极快的访问。数据存在于关系模式中,实体之间的关系是“加入”的要求,但根本不是写入数据库的要求(它会离线生成)。 我非常相信
我使用 GrapheneDB 来托管我的 neo4j 数据库 (db)。 问题 我有 N客户并且正在寻找自动分离他们的内容(他们独特的数据库)的方法,以便: 它不重叠数据 操作速度不受影响。 选项 1
当服务器开始工作(Tomcat)时,日志显示此错误: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid b
我在 Oracle 数据库实例中按以下方式创建了一个触发器。 CREATE OR REPLACE TRIGGER after_logon_on_database AFTER LOGON ON DATA
原谅我的无知,我是数据库约定的初学者。 这是我的 SQLite 代码:(由我的数据库浏览器自动生成) CREATE TABLE `ResearchItems` ( `ID` INTEGER NO
是的是的是的,我已经在整个互联网上搜索过这个问题。一些结果发现,甚至来自 Stackoverflow。但是他们中的大多数人说“你应该自动加载数据库”,或者“parent::__construct();
我正在创建一个 Mac 应用程序,它将一些数据保存到 SQLite 数据库中。问题是:当我关闭数据库并再次打开时,数据不存在了。这是我的代码: NSString *sql = [NSString st
我正在建立一个网站,我打算发布各种帖子,比如教程、文章等。我打算用 php 来管理它,但是当涉及到存储每个帖子的内容时,将要显示的文本,更好的选择是:使用单独的文本文件还是将其添加为数据库中的每个条目
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
对不起,这个关键字对我来说没有任何意义...有人可以给我一个定义吗? 提前致谢... 最佳答案 这是一个品牌。 http://pervasive.com/这是他们的数据库产品的链接 http://ww
我已经在 docker 版本 1.10.1 的 docker 镜像中安装了 PostgreSQL 9.4.6。根据这张官方图片: https://github.com/docker-library/p
当我的 android 应用程序尝试读取 android 短信数据库时,我遇到了这个崩溃。读取android短信数据库的代码类似于下面的代码 fragment : String SMS_URI = "
我有一个 public kit repo,我推送了 v1.0.3 并具有以下结构 go -database --database.go --go.mod --go.sum 我需要它 require g
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我们正在使用MySQL数据库在Go中创建一个Web应用程序。我们的用户一次只能拥有一个活跃的客户端。就像Spotify一样,您一次只能在一台设备上听音乐。为此,我制作了一个映射,将用户ID和作为其值的
我已经尝试在 PostgreSQL 中创建数据库好几天了,遇到了几个问题,但似乎卡住了。 我在 PostgreSQL 中手动创建了一个名为 postgres_development 的数据库,因为 b
我正在创建一个 iMessage 应用程序,它需要连接到与我的常规应用程序相同的数据库。 我调用 FirebaseApp.configure() 并对用户进行身份验证,但出于某种原因,在所有 Data
就像std::unordered_map但所有数据都应存储在磁盘上而不是内存中。 按照我的理解,应该做两部分:索引和存储。我已经学习了一些关于索引的数据结构,比如 Linear-Hash 或 B-Tr
我是一名优秀的程序员,十分优秀!