2017-04-05 2 views
1

데이터베이스의 필드를 업데이트하는 것과 관련하여 개념상의 의심이 있습니다.사용자 컴퓨터에서 테이블을 올바르게 업데이트하는 방법은 무엇입니까?

I는 데이터를 저장하는 SQLite는를 사용 Qt는 (C++) 애플리케이션을 개발했다. SQLite 파일 (.db)은 사용자 컴퓨터에 저장됩니다. 이 파일은 사용자가 응용 프로그램을 처음 열 때 자동으로 만들어집니다.

문제는 해당 데이터베이스에서 하나의 테이블을 업데이트해야한다는 것입니다. ALTER TABLE 명령을 사용하여 수행 할 수 있지만 사용자 컴퓨터에 할당 된 데이터베이스의 테이블을 제대로 업데이트하려면 어떻게해야합니까?

테이블에 원하는 필드가 없는지 확인한 다음 ALTER TABLE 명령을 실행하거나 다른 쉽고 올바른 방법이 있는지 확인해야하는 기능을 만들어야합니까?

+0

응용 프로그램을 어떻게 배포합니까? 업데이트 프로그램을 사용하여 응용 프로그램을 업데이트하는 경우 업데이트 프로그램에서 열의 존재 여부를 확인하고 필요에 따라 DB를 업데이트 할 수 있습니다. – NathanOliver

+0

감사합니다. @ NathanOliver. 아쉽게도 업데이터가 없으며 응용 프로그램 (.exe)은 전자 메일로 보내진 링크로 배포됩니다. 그러나 응용 프로그램에서 직접 열의 존재 여부를 확인할 수 있습니다. – KelvinS

답변

3

좀 더 일반적인 해결책은 DB의 버전 번호 항목을 사용하고 이에 따라 변경 사항을 중앙화하는 것입니다. 가지고 있지 않으면이 업데이트로 만들 수 있습니다. 적어도 나는 그것이 코드에서 명확하게 생각하고 향후 수정에 대한 단일 지점이 있습니다 반면에

void update_database_to_current_version() { 
    const int version = current_db_version(); // returns 1 if version is not found 

    if (version < 2) { // since version 2 table XYZ has new structure, match here 
     // 'ALTER TABLE' ... 
    } 

    // if (version < N) // DB changes starting in version N 
    // ... 

    update_db_version_to_newest(); 
} 

을, 지금까지의 지금, 당신은 테이블에 영향을주지 않고 ALTER TABLE 여러 번 실행할 수있는, 원하는 경우 더 빠른 옵션이 될 수 있습니다.

+3

일반적으로 사용자가 수행하는 작업은 "버전 래더 (version ladder)"입니다.이 버전은 각 다음 버전에 대한 모든 단일 업데이트 단계가있는 기능입니다. 그래서 그것은'switch'가 아니라'if'의 시리즈 일 것입니다. 각 단계는 버전을 다음 단계로 업데이트합니다. –

+0

오른쪽! 나는 내 생각을 그리는 중이다 ... 나는이 제안으로 대답을 업데이트하고있다! – cbuchart

+0

대단히 감사합니다 @ cbuchart, 내 문제에 대한 훌륭한 해결책 인 것 같습니다. DB에 버전 번호 항목이 없지만 ** SQLite **에서이 항목을 사용하는 방법을 검색 할 것입니다. – KelvinS

관련 문제