2014-04-05 2 views
1

ios/android 용 cordova에서 매우 간단한 응용 프로그램을 만들고 있습니다. 나는 그것을 모두 만들었지 만 나는 데이터베이스에 문제가있다. 나는 애플 리케이션이 인터넷을 찾았을 때 인터넷을 찾는다. 인터넷이 api를 사용하여 로그인하는 것보다 사용 가능하지만 또한 사용자 로그인을 위해 두 개의 데이터베이스 하나를 만든다. (좋은 연습은 아니지만 나의 요구 사항은 뭔가를 검색 할 것이다. 데이터베이스 암호화)를 사용하고 현재 사용자 만 데이터베이스에 저장합니다. 다른 db는 사용자의 오프라인 작업을 저장하는 데 사용됩니다. 그러나 내가 db가 이미 만들어 졌는지 알 수있는 방법을 분명히하지 않을 때. 다음은 코드입니다. 친절하게 점검합니다. 어디에서나 검색 할 수 있으며, 테이블을 확인하는 것 외에는 해결책이없는 것 같지만 체크 테이블을 만들 때 프로그램이 작동을 멈 춥니 다.웹 SQL이 이미 존재하는지 어떻게 알 수 있습니까?

응용 프로그램이 시작되면 명령 실행 후 유효성 검사 후보다 userid, password를 묻습니다. 인터넷이 여기 액세스 DB를 사용할 수 없지만 가능한 경우 인터넷이, 사용자 로그인 및 DB를 만들 경우

document.addEventListener("deviceready", onDeviceReady(user, serviceURL, pass), false) 

다음은 DB 그렇게 로그인 사용자를 할 수있는 경우 내가 아는 방법, 문제는 내가 deviceready에 사용하고 기능입니다 그렇지 않으면 처음으로 인터넷이 필요하다는 경고를 보냅니다.

function onDeviceReady(user, serviceURL, pass) { 
if(navigator.network.connection.type == Connection.NONE) 
{ 
    var db = window.openDatabase(
         'test', 
         '1.0.0', 
         'Test Database', 
         64 * 1024 
         ); 

     db.transaction(function (tx) { 
     tx.executeSql('SELECT * FROM USERS', [], function (tx, results) { 
     var len = results.rows.length, i; 
     msg = "<p>Found rows: " + len + "</p>"; 
           } 
           alert(msg); 
           for (i = 0; i < len; i++){ 
           alert(results.rows.item(i).user); 
           } 
           }, null); 
        }); 
    } 
else 
{ 
    alert("Internet is available!!"); 


$.getJSON(serviceURL + 'APIjson.php?user='+user+'&pass='+pass+'&action=login', function(data) 
       { 
       if(data.error==-1) 
       { 
       alert("Invalid user id or password."); 
       return false; 
       } 
       else { 
       //navigator.notification.activityStop(); // for android only 
       // ActivityIndicator.hide(); // for IOS 

       window.localStorage["user_id"] = data.id; 

       var db = window.openDatabase(
              'test', 
              '1.0.0', 
              'Test Database', 
              64 * 1024 
              ); 

       db.transaction(function populateDB(tx) { 

       tx.executeSql('DROP TABLE IF EXISTS USERS'); 
       tx.executeSql('CREATE TABLE IF NOT EXISTS USERS (id unique, user, pass)'); 
       var sql = 'INSERT INTO USERS (id, user, pass) VALUES (?, ?, ?)'; 
       tx.executeSql(sql,[data.id, user, pass]); 
       },function errorCB(tx, err) { 
       alert("Error processing SQL: "+err);         
          },function successCB() { 
          alert("success!");         
          }); 
       window.location.href = "contact.html"; 
       return true; 
       } 
       }) 
} 
} 

는 또한 데이터베이스 행이 와서는 경고한다 howmany 렌에 검색 할 때 추가하려고하지만 실패하고 내 응용 프로그램 중지 당신은 자바 스크립트가로 재 이동해야을

if (!len > 0) { 
     alert("Sorry you need to connect internet for first time use"); 
           return false; 

답변

3

를 작동 성공 콜백 :

db.transaction(function populateDB(tx) { 
     tx.executeSql('DROP TABLE IF EXISTS USERS'); 
     tx.executeSql('CREATE TABLE IF NOT EXISTS USERS (id unique, user, pass)'); 
     var sql = 'INSERT INTO USERS (id, user, pass) VALUES (?, ?, ?)'; 
     tx.executeSql(sql,[data.id, user, pass]); 
    },function errorCB(tx, err) { 
     alert("Error processing SQL: "+err);         
    },function successCB(){ 
     alert("success!");         
     window.location.href = "contact.html"; 
}); 

문제는 트랜잭션을 완료 할 수있는 기회를하기 전에 당신이 떨어져 현재 페이지에서 이동하는 것입니다. 콜백의 요점은 나중에 비동기 태스크가 완료 될 때 호출된다는 것입니다. 그러나 페이지에서 벗어나면 웹보기는 현재 페이지의 모든 작업을 삭제하고 계속 이동합니다.

둘째, 대신 드롭 당신이 사용해야 작성 : 데이터가 추가 된 경우

db.executeSql('CREATE TABLE IF NOT EXISTS tableName (someID text primary key, data text)'); 

를 보려면 :

난 당신이 DB와 ​​상호 작용하는 크롬 콘솔을 사용하는 것이 좋습니다. https://developers.google.com/chrome-developer-tools/docs/remote-debugging

당신은 예를 들어 몇 db.executeSql (SELECT 문)을 작성해야합니다 사용

db.transaction(function(tx) { 
    tx.executeSql("select * from table1 where theID ='"+theID+"';", [], function(tx, rs) { 
for (var i=0; i < rs.rows.length; i++) { 
    console.log(rs.rows.item(i)); 
    console.log('data found in db'); 
} 
if(rs.rows.length < 1){ 
    console.log('data not in db'); 
    } 
    },function(tx,e){console.log(e.message);}); 
}); 

데이터베이스를 확인하려면 크롬 디버거 :

  1. 디버그 모드에서 전화 연결을/에뮬레이터를 시작하십시오
  2. 크롬에이 URL로 이동하십시오 : chrome : // inspect/
  3. 앱을 찾고 inspect를 클릭하십시오. 새 창이 열립니다.
  4. 상단의 리소스 탭을 클릭하십시오. 왼쪽 창에서
  5. 데이터가 존재하거나 존재하지 않는 경우 WebSQL 무엇 확인에 대한 screen shot chrome debugger
+0

감사를, (스크린 샷 참조)를 클릭! – KamalPanhwar

+0

데이터베이스가 저장소에 있는지 여부를 알 수있는 방법이 없다는 뜻입니까? 나는 이것이 모든 것을 향해 나아가고 있다고 대답을 많이 확인했다.내 웹 SQL이 이미 존재하는지 알 수있는 방법이 있어야합니다! 나는 버전으로 노력하고 있지만 여전히 코딩에 대해 혼란스러워하고있다. – KamalPanhwar

+0

가능합니다. 질문에 대한 답변이 있으면 크롬 디버그 콘솔 – Nosh

관련 문제