我在我的項目中使用sqlite3。sqlite3「無法打開數據庫文件」 - ios
- 我交易的夫婦(50-60)後收到錯誤「無法打開 數據庫文件」,所以,檢查我的數據庫文件的路徑,但路徑是正確的, 文件是存在的。
我試過在棧溢出上討論的每一個解決方案,但沒有運用
。我檢查我的「DocumentDirectory」路徑,完成關閉數據庫之前的所有必要步驟。像:
sqlite3_finalize(selectStatement);
sqlite3_close(database);
我不知道如何解決這個問題。 我可以檢查我的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; }
問題可能在於您尚未與我們分享的部分代碼。您沒有向我們展示哪一行報告了您報告的錯誤。我想知道是否有一些路徑可以打開數據庫,但忽略關閉它。此外,記錄每一次關閉(這樣可以確保開放和關閉語句正確配對)。如果打開失敗,我可能會建議記錄錯誤(現在,如果打開失敗,它將保持沉默,這在您的日誌中很難識別)。順便說一句,沒有必要爲每個數據庫交互打開和關閉數據庫。 – Rob
另外,您可能要認真考慮[FMDB](https://github.com/ccgus/fmdb),它簡化了SQLite編程。 – Rob
@Rob sqlite3_close(database); NSLog(@「database close%d」,sqlite3_close(database)); //給我21是好的。 –