簡體   English   中英

sqlite3“無法打開數據庫文件” - ios

[英]sqlite3 “unable to open database file” - ios

我在我的項目中使用sqlite3。

  • 在“無法打開數據庫文件”的事務(50-60)之后我收到錯誤,所以檢查我的數據庫文件路徑但是路徑是正確的並且文件在那里。
  • 我嘗試了在堆棧溢出時討論的每個解決方案,但沒有
    運氣。

  • 我檢查了我的“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM