gpt4 book ai didi

iphone sqlite 'unable to open database file' 有时

转载 作者:行者123 更新时间:2023-12-03 20:16:26 24 4
gpt4 key购买 nike

我正在使用数据库类来使用sqlite数据库

#import "DatabaseConnection.h"

@implementation DatabaseConnection
-(void)DBInitalize{
databaseName = @"sensorystimulation.sql";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
[self checkAndCreateDatabase];
[self readFromDatabase];
}
-(NSMutableArray *)settingsData{
return settingsArray;
}

-(void)checkAndCreateDatabase{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:databasePath];
if(success)
return;

NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}
-(void)readFromDatabase{
settingsArray = [[NSMutableArray alloc] init];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
const char *sqlStatementNew = "my sql query";
sqlite3_stmt *compiledStatementNew;
if(sqlite3_prepare_v2(database, sqlStatementNew, -1, &compiledStatementNew, NULL) == SQLITE_OK) {
while(sqlite3_step(compiledStatementNew) == SQLITE_ROW) {
NSString *key_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 0)];
NSString *key_value = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 1)];
NSMutableDictionary *tempDic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:key_name,@"key_name",key_value,@"key_value",nil];
[settingsArray addObject:tempDic];
[tempDic release];
}
sqlite3_finalize(compiledStatementNew);
}
}
}
-(void)updateSettings:(NSMutableArray *)values{
for (int l=0; l<[values count]; l++) {
NSString *key_name = [[values objectAtIndex:l] objectForKey:@"key_name"];
NSString *key_value = [[values objectAtIndex:l] objectForKey:@"key_value"];
sqlite3_stmt *updateStmt;
NSString *ts=[NSString stringWithFormat:@"UPDATE table key_value='%@' where key_name='%@'",key_value,key_name];
const char *sql = [ts cStringUsingEncoding:1];
if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK){
NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database));
}
if(SQLITE_DONE != sqlite3_step(updateStmt)){
NSLog(@"%@",ts);
NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database));
}
}
}

-(void)quitApp{
sqlite3_close(database);
}
@end

并像这样调用它的对象

初始化

databaseConnection = [[DatabaseConnection alloc] init];
[databaseConnection DBInitalize];

更新数据库

NSMutableArray *valueArray = [[NSMutableArray alloc] init];
[valueArray addObject:[[[NSMutableDictionary alloc] initWithObjectsAndKeys:@"abc",@"key_name",[NSString stringWithFormat:@"%d",abc],@"key_value",nil] autorelease]];
[valueArray addObject:[[[NSMutableDictionary alloc] initWithObjectsAndKeys:@"xyz",@"key_name",[NSString stringWithFormat:@"%d",xyz],@"key_value",nil] autorelease]];
[databaseConnection updateSettings:valueArray];
[valueArray release];

效果很好。使用没问题

但是经过大约100-200次的大量更新后,会出现以下日志(错误)..并且每次发生此错误后我都无法更新数据库。之后我必须退出应用程序然后我再次它工作正常

Error while updating. 'unable to open database file'

因此,在 ImageView 上的选项卡发生错误后,我的其他功能也无法工作

任何想法都可以考虑这一点。请帮忙。

-阿米特·巴坦

最佳答案

1)您是否看过这两个问题:
unable to open database
Sqlite Opening Error : Unable to open database

您可能会遇到与上述问题中报告的类似问题。
您似乎在“updateSettings”中缺少 sqlite3_finalize。
每次释放“databaseConnection”时都会关闭数据库吗?

2)
您是否打开 DB 100-200 次?
如果是这样,也许您应该考虑这是否是您应用程序的最佳方法。

您是否考虑过使用 Singleton 进行数据库访问? -> 在初始化期间打开一次数据库,然后每次都重新使用该连接。这不仅可以加快您的应用程序的速度,还可以减少内存使用量。查看:
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
在做出决定时,您应该考虑应用程序中是否有多个线程同时访问数据库。

最好,
拉尔夫

关于iphone sqlite 'unable to open database file' 有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com