iphone sqlite'有时无法打开数据库文件'

Posted

技术标签:

【中文标题】iphone sqlite\'有时无法打开数据库文件\'【英文标题】:iphone sqlite 'unable to open database file' sometimeiphone sqlite'有时无法打开数据库文件' 【发布时间】:2011-05-24 12:04:51 【问题描述】:

我正在使用数据库类来使用 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'

由于这个原因,我的其他功能在图像视图上的选项卡发生错误后也不起作用

关于这个的任何想法。请帮忙。

-阿米特巴坦

【问题讨论】:

是的,这是 db.. 的完整类代码。函数 -(void)updateSettings:(NSMutableArray *)values 有问题 【参考方案1】:

1) 这两个问题你看了吗:unable to open databaseSqlite Opening Error : Unable to open database

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

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

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

最好的, 拉尔夫

【讨论】:

以上是关于iphone sqlite'有时无法打开数据库文件'的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite3 数据库表无法在 XCode 4.2 中打开

将 sqlite3 db 关联到 iPhone 应用程序

SQLite - 无法打开数据库文件

SQLite 无法打开数据库文件:Laravel + Windows

Sqlite 错误无法打开数据库文件

Flask OperationalError:无法使用 sqlite3 打开数据库文件