[英]sqlite3 “unable to open database file” - ios
我在我的項目中使用sqlite3。
我嘗試了在堆棧溢出時討論的每個解決方案,但沒有
運氣。
我檢查了我的“ DocumentDirectory ”路徑,在關閉數據庫之前完成了所有必要的步驟。 喜歡:
sqlite3_finalize(selectStatement);
sqlite3_close(數據庫);
我不知道如何解決這個問題。 我可以檢查我的sqlite3數據庫是否打開 。
====================== 1 =========================== =
+(NSMutableArray*)executeDataSet:(NSString*)query { NSMutableArray *arryResult = [[NSMutableArray alloc] initWithCapacity:0]; const char *sql = [query UTF8String]; sqlite3_stmt *selectStatement; sqlite3 *database = [DataBaseClass openDataBase]; //prepare the select statement int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL); if(returnValue == SQLITE_OK) { //my code } } //sqlite3_reset(selectStatement); // NILOBJECT(selectStatement); // NILOBJECT(selectStatement); sqlite3_finalize(selectStatement); sqlite3_close(database); return arryResult; }
==================== 2 ============================= ====
+(sqlite3 *) openDataBase { sqlite3 * edenAdultDatabase; NSString * databasePath =[DataBaseClass pathForDatabase]; if(sqlite3_open([databasePath UTF8String], &edenAdultDatabase) == SQLITE_OK) { NSLog(@"Yes database is open"); return edenAdultDatabase; } else { NSLog(@"do something %s",sqlite3_errmsg(edenAdultDatabase)); } return edenAdultDatabase; }
====================== 3 ===========================
+(NSString *) pathForDatabase { NSString *libraryDir = [FileManager pathForPrivateDocumentsFolder]; NSFileManager *fileMgr = [NSFileManager defaultManager]; NSError *error; NSString *privateFolderPath = [libraryDir stringByAppendingPathComponent:@"DataBase"]; if (![fileMgr fileExistsAtPath:privateFolderPath]) { [fileMgr createDirectoryAtPath:privateFolderPath withIntermediateDirectories:NO attributes:nil error:&error]; } /* // My database in library private folder ..this is just for test. // I copied databae to document dir but no luck. NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDir = [documentPaths objectAtIndex:0]; privateFolderPath = [documentsDir stringByAppendingPathComponent:kDatabaseName]; */ privateFolderPath = [privateFolderPath stringByAppendingPathComponent:kDatabaseName]; return privateFolderPath; }
數據庫連接存在一個奇怪的問題,有時它無法連接。 因此,人們建議您的應用程序應該打開一次數據庫(在初始化階段)並在應用程序終止時關閉連接。
參考: Sqlite開放問題
關於檢查數據庫連接,Sqlite3沒有提供任何方法來檢查數據庫是否打開。
通過使用數據庫管理器的共享實例,您可以實現它。 在類級別定義布爾值並在打開數據庫時設置它的值:
// .h file
BOOL isDatabaseOpen;
// .m file
-(void) openDatabase
{
if(![self isDatabaseExist])
{
// copy database to library
[self copyDatabaseFile];
}
NSString *sqLiteDb = [self getDatabaseLibraryPath];
if (sqlite3_open([sqLiteDb UTF8String], &_databaseHandler) != SQLITE_OK) {
NSLog(@"Database --> Failed to open");
isDatabaseOpen = NO;
}
else
{
isDatabaseOpen = YES;
}
}
然后您可以使用以下方法檢查數據庫是否已打開。
-(BOOL) isDatabaseOpen
{
return isDatabaseOpen;
}
讓我知道它是否有效:)。
看看這種解決方案
首先創建如下函數:
-(void)checkDBAndCopy{
NSArray *dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *connectionPath=[dirPath objectAtIndex:0];
strDBPath=[connectionPath stringByAppendingPathComponent:@"database.sqlite"];
NSLog(@"%@",strDBPath);
NSFileManager *filemanager=[[NSFileManager alloc]init];
if (![filemanager fileExistsAtPath:strDBPath]) {
NSString *databasePathFromApp=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"database.sqlite"];
[filemanager copyItemAtPath:databasePathFromApp toPath:strDBPath error:nil];
}
}
並調用此函數如下方法: -
-(NSMutableArray *)RetriveSharedspots:(NSString *)Query{
[self checkDBAndCopy];
if (sqlite3_open([strDBPath UTF8String], &contactDB)==SQLITE_OK) {
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(contactDB, [Query UTF8String],-1,&statement,NULL)==SQLITE_OK)
{
while (sqlite3_step(statement)==SQLITE_ROW) {
// Your code
}
}
sqlite3_finalize(statement);
}
sqlite3_close(databaseName);
return array;
}
以上這對我很有幫助。 嘗試這個。
只是與這個問題分享我的案例。
我有一個使用databaseFile1.sqlite
的項目,我不確定它是否在我的模擬器上安裝了它。
然后我更改了數據庫文件,說databaseFile2.sqlite
不同的內容,不同的文件名。 然后出現了這個問題。 當我閱讀解決方案和評論時,我意識到問題不應該那么大。
Welp,我刪除了構建並重新啟動了Xcode。 瞧。 現在沒關系。 稍后,我將恢復到databaseFile1.sqlite
數據庫,我將看看是否可以重現此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.