2012-06-06 4 views
1

PhoneGap 및 jQueryMobile을 사용하여 iOS 및 Android 용 교차 플랫폼 HTML/Javascript 앱을 만들고 있는데, 로컬 데이터베이스 (localdatabase/websql)의 한 테이블에 몇 가지 새로운 필드가 추가되었습니다.로컬 데이터베이스 (websql)에 원하는 새 필드가 포함되어 있는지 테스트하고없는 경우 추가하십시오.

나는 데이터베이스가 새 테이블 필드, 기존 사용자 데이터로 확장 될 때, 사용자 데이터를 제거하거나 데이터베이스의 inaccesible 이전 버전에 잠긴되지 않습니다 있는지 확인하려면 도전 .

배경 : 내 응용 프로그램에는 사용자 데이터 (소득 및 비용, 몇 가지 설정 포함)의 로컬 데이터베이스가 있습니다. 이러한 데이터는 신뢰할 수 있어야하며 처음 시작할 때 돌아갈 방법은 HTML5 localDatabase 기능을 사용했습니다.이 기능은 영구적이며 iOS 및 Android 브라우저뿐만 아니라 대부분의 데스크톱 브라우저에서 사용할 수 있기 때문에 사용할 수 있습니다.

localdb를 좀 더 쉽게 다루려면 persistenceJS라는 Javascript 플러그인/라이브러리/thingy를 사용하고 있습니다. 하지만 제 질문은 지속성에 정말로 관련이 없습니다 .JS.

새로운 버전의 앱에서 작업하고 있는데, 이는 설정 테이블의 몇 가지 새로운 필드를 사용합니다. 따라서이 사용자가 새 앱을 다운로드하여 실행하면 Settings 테이블에이 필드가 포함되어 있는지 테스트해야하며 그렇지 않은 경우 필드를 만들어야합니다.

어떻게 테스트합니까?

  1. openDatabase 기능에서 사용되는 데이터베이스 레이블을 사용하십시오. 이것은 일부 개발자가 버전 번호를 저장하는 데 사용되는 것으로 보입니다. 이 옵션을 사용할 때 문제가되는 것은 openDatabase를 사용하여 데이터베이스를 열고 (존재하지 않으면 새 데이터베이스를 만드는) openDatabase를 사용하는 방법 만 알고 데이터베이스가 아직없는 경우 콜백을 구체적으로 실행하는 것입니다. 레이블에 "v2"와 같은 것을 지정하면서 테이블을 열면 새로운 테이블이 생성됩니까? 그렇다면 이전 테이블의 값을 새 테이블에 복사합니까?

  2. 테이블 필드가 있는지 확인하십시오 ... openDatabase를 사용하여 테이블 필드의 존재 여부를 테스트 할 수 있습니다. 그렇지 않으면 추가 할 수 있습니다. 이 테스트는 사용자가 앱을 열 때마다 실행되며 이는 약간 원시적 인 것으로 보입니다. 그런데

: 내가 webSQL/localDb 군주에 의해 사용되지 않습니다 알고 있지만, 그것은 여전히 ​​내 도구가 내가 지금 그것에 충실하고자합니다.

답변

1

나는 localDb opendatabase에 대해 더 많이 배우고 그것을 마이그레이션했기 때문에 또 다른 대답을 추가하고 있습니다.데이터베이스 버전 레이블 (문자열) 이름 - - (문자열) 당신이 표시 라벨을 열고 자하는 버전 - (문자열) 꽤 쓸모 표시 이름 보인다 가 이름 : 말씀 드리지만

는 수 OpenDatabase는 이러한 매개 변수를 아무 곳에도 사용되지 수 최대 크기 - (int)를 가장 큰 안전 크기 1024 * 5 * 1024 새로 생성 - 이전에 존재 = (기능) DB를하지 않았다 경우 해고 될

그것은 수 OpenDatabase의 출력을 지정하는 현명한입니다 변수에. 나는.

myapp.db = openDatabase ('mydb', '', '내 데이터베이스', 5 * 1024 * 1024, newlyCreatedCallback);

먼저 openDatabase의 다섯 번째 인수로 사용할 수있는 '새로 생성 된'콜백을 사용하는 것이 좋습니다. 지정한 매개 변수가있는 데이터베이스가없는 경우에만 실행됩니다. 데이터베이스가 이미 존재할 때이 콜백이 발생하지 않게하려면 이름, 표시 레이블 및 최대 크기가 데이터베이스를 처음 만들 때 사용한 값과 정확히 일치하도록 설정해야합니다.

데이터베이스를 처음 작성한 경우 마이그레이션을 수행 할 필요가 없다는 것을 알고 있어야합니다. 테이블과 필드를 추가하는 함수로 바로 갈 수 있습니다. 로컬 데이터베이스를 읽고 조작하는 데 도움이되는 도구 인 persistenceJS를 사용하는 것이 좋습니다.

openDatabase를 호출하기 전에 jQuery를 사용하여 처리기가 마이그레이션을 실행할 사용자 정의 이벤트 'dbopen'을 만드는 것이 좋습니다. 이 핸들러는 두 개의 이벤트에 의해 트리거 될 수 있습니다. 첫 번째는 방금 논의한 '새로 만든'콜백입니다. 두 번째는 openDatabase를 호출 한 후 정의하는 setInterval입니다. 간격은 openDatabase 출력을 할당 한 myapp.db 변수의 존재 여부를 확인해야합니다.

dbopen 사용자 정의 이벤트를 작성하는 이유는 전체적으로 많은 이벤트를 트리거하는 '새로 작성된'콜백을 추가하고 나중에 코드의 흐름을 계속하면 '새로 작성하지 않은' 만든 '시나리오. 이 작업을 수행하는 openDatabase에 대한 콜백이 없으므로 로컬 데이터베이스 생성을 수동으로 감지하고 'dbopen'이 발생하자마자 트리거해야합니다.

여기에 window.setInterval을 사용합니다. jquery의 .one() 함수를 사용하여 사용자 지정 'dbopen'이벤트를 생성해야합니다.이 이벤트는 한 번만 실행됩니다. 그렇지 않으면 데이터베이스가 새로 생성 된 경우 '새로 생성 된'콜백이 발생하면 open 이벤트가 한 번 발생하고 myapp.db 변수가 생기면 한 번 발생합니다.

+0

이 콜백의 예를 들어 줄 수 있습니까?이 함수로 데이터베이스의 존재를 확인할 수 있습니까? @Wytze – Learner

1

나는 대답을 여기에서 찾아 냈다 : http://blog.maxaller.name/2010/03/html5-web-sql-database-intro-to-versioning-and-migrations/.

기본적으로 이전 버전과 새 버전 레이블로 changeVersion 메소드를 적용하면됩니다. 레이블이 없으면 이전 레이블은 ""입니다. relabeling하는 동안 webSQL은 새 스키마를 이전 데이터베이스에 자동으로 적용합니다. 제 경우에는 새로운 필드를 추가하는 것을 의미합니다.

내가 연계 된 튜토리얼은 정말 멋지다 (기능도 그렇다).