투케이2K

391. (ios/swift5) [SQLite] createTable : SQLITE 테이블 생성 수행 - sqlite3_exec 본문

IOS

391. (ios/swift5) [SQLite] createTable : SQLITE 테이블 생성 수행 - sqlite3_exec

투케이2K 2023. 12. 17. 09:55
반응형

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

    // -----------------------------------------------------------------------------------------
    // MARK: - [SEARCH FAST] : createTable : SQLITE 테이블 생성 수행
    // -----------------------------------------------------------------------------------------
    func createTable(folderName: String, dbName: String, tableName: String, keyColumnName: String, valueColumnName: String) -> Bool {
        
        /*
        // -----------------------------------------
        [createTable 메소드 설명]
        // -----------------------------------------
        1. SQLITE 테이블 생성 수행
        // -----------------------------------------
        2. 호출 방법 :
         
         S_SQLite().createTable(folderName: "DataBaseFolder", dbName: "app.sqlite", tableName: "preferences", keyColumnName: "MY_KEY", valueColumnName: "MY_VALUE")
        // -----------------------------------------
        3. 리턴 데이터 :
         
         true / false
        // -----------------------------------------
        4. 참고 info plist 설정 :
         
         아이폰 파일 접근 설정 : Supports opening documents in place : YES
         아이튠즈 공유 설정 : Application supports iTunes file sharing : YES
        // -----------------------------------------
        */
        
        
        // [변수 선언]
        var returnData = false
        var M_LOG = ""
        var fileWritePath = ""
        
        
        // [로직 처리 실시]
        var documentsUrl: URL? = nil
        do {
            documentsUrl = try FileManager.default.url(
                for: .documentDirectory,
                in: .userDomainMask,
                appropriateFor: nil,
                create: false)
        } catch {
            M_LOG = "[Error] :: \(error.localizedDescription)"
        }
        
        if documentsUrl != nil && C_Util().stringNotNull(str: folderName) == true && C_Util().stringNotNull(str: dbName) == true
            && C_Util().stringNotNull(str: tableName) == true && C_Util().stringNotNull(str: keyColumnName) == true
            && C_Util().stringNotNull(str: valueColumnName) == true {
                    
            if C_Util().stringNotNull(str: documentsUrl?.description ?? "") == true {
                
                fileWritePath = documentsUrl?.appendingPathComponent(folderName).path ?? ""
                
                if FileManager.default.fileExists(atPath: fileWritePath) == false { // [저장 된 경로 없음 >> 폴더 생성 실시]
                    do {
                        
                        // [로직 처리 변수 선언]
                        var checkError = false
                        
                        // [디렉토리 생성 유무 확인]
                        try FileManager.default.createDirectory(atPath: fileWritePath, withIntermediateDirectories: true, attributes: nil)
                        
                        if (fileWritePath.hasSuffix("/") == true){
                            fileWritePath = fileWritePath + dbName
                        }
                        else {
                            fileWritePath = fileWritePath + "/" + dbName
                        }
                        
                        M_LOG = "[First Folder Create] :: "
                        
                        var db: OpaquePointer? = nil // [SQLite 전용 포인터]
                        if sqlite3_open(fileWritePath, &db) == SQLITE_OK {
                            checkError = true
                        }
                        else {
                            M_LOG += "[Error] :: Create DB"
                        }
                        
                        // [테이블 생성 수행]
                        if checkError == true {
                            let CREATE_QUERY_TEXT : String = "CREATE TABLE IF NOT EXISTS \(tableName) (\(keyColumnName) TEXT, \(valueColumnName) TEXT)"
                            
                            if sqlite3_exec(db, CREATE_QUERY_TEXT, nil, nil, nil) != SQLITE_OK {
                                let errMsg = String(cString:sqlite3_errmsg(db))
                                M_LOG += "[Error] :: Table Create Error :: \(errMsg)"
                            }
                            else {
                                M_LOG += "[Success] :: Table Create Query :: \(CREATE_QUERY_TEXT)"
                                returnData = true
                            }
                        }
                        
                    } catch {
                        M_LOG = "[Exception] :: \(error.localizedDescription)"
                    }
                }
                else { // [폴더 >> 있음]
                    M_LOG = "[Folder Exists] :: "
                    
                    if (fileWritePath.hasSuffix("/") == true){
                        fileWritePath = fileWritePath + dbName
                    }
                    else {
                        fileWritePath = fileWritePath + "/" + dbName
                    }
                    
                    // [로직 처리 변수 선언]
                    var checkError = false
                    
                    var db: OpaquePointer? = nil // [SQLite 전용 포인터]
                    if sqlite3_open(fileWritePath, &db) == SQLITE_OK {
                        checkError = true
                    }
                    else {
                        M_LOG += "[Error] :: Create DB"
                    }
                    
                    // [테이블 생성 수행]
                    if checkError == true {
                        let CREATE_QUERY_TEXT : String = "CREATE TABLE IF NOT EXISTS \(tableName) (\(keyColumnName) TEXT, \(valueColumnName) TEXT)"
                        
                        if sqlite3_exec(db, CREATE_QUERY_TEXT, nil, nil, nil) != SQLITE_OK {
                            let errMsg = String(cString:sqlite3_errmsg(db))
                            M_LOG += "[Error] :: Table Create Error :: \(errMsg)"
                        }
                        else {
                            M_LOG += "[Success] :: Table Create Query :: \(CREATE_QUERY_TEXT)"
                            returnData = true
                        }
                    }
                    
                }
                
            }
            else {
                M_LOG = "[ERROR] :: documentsUrl Is Null"
            }
            
        }
        else {
            M_LOG = "[ERROR] :: Input Data Is Null"
        }

        
        // [로그 출력 실시]
        S_Log._D_(description: "SQLITE 테이블 생성 수행", data: [
            "INPUT [folderName] :: \(folderName)",
            "INPUT [dbName] :: \(dbName)",
            "INPUT [tableName] :: \(tableName)",
            "INPUT [keyColumnName] :: \(keyColumnName)",
            "INPUT [valueColumnName] :: \(valueColumnName)",
            "M_LOG :: \(M_LOG)",
            "SAVE_PATH :: \(fileWritePath)",
            "RETURN :: \(returnData)"
        ])
        
        
        // [리턴 반환 수행]
        return returnData
        
    }
 

[결과 출력]


반응형
Comments