2012-05-21 4 views
6

안드로이드 프로그램에서 직접 원격 SQL 데이터베이스 (웹 서버)에 액세스 할 수 있습니까? 즉, 필요한 모든 매개 변수로 연결을 열고 SQL 쿼리를 수행하면됩니까?원격 SQL 데이터베이스에 안드로이드 액세스

이 프로그램은 특정 단말기에서만 사용할 수있는 비공개 프로그램이므로 공개되지 않습니다. 제 3자가 데이터베이스 액세스 권한을 얻는 것에 대해 걱정하지 않습니다.

그렇다면 Java에서 필요한 라이브러리는 무엇입니까?

감사합니다.

답변

18

이 질문은 여러 번 나타났습니다. 당신은 당신의 안드로이드 장치에 MSSQL JDBC 드라이버를 배치하고 SQL 서버를 인터넷에 직접 노출 시키면 귀하의 안드로이드 장치를 SQL 서버에 직접 연결할 수 있습니다. 안드로이드에서 MSSQL 드라이버가 제대로 작동한다면 완전히 다른 문제입니다.

그렇다면 어떻게 할 수 있을까요? 그러나 여기 왜 그것이 나쁜 생각인지입니다.

  1. SQL 서버는 인터넷에 직접 노출됩니다. MSSQL 서버와 안드로이드 장치간에 데이터를 암호화하지 않으면 해커가 장치와 MSSQL간에 TDS 데이터 스트림을 스니핑하고 리버스 엔지니어링하여 데이터를 도용하는 것이 상대적으로 쉽습니다. 암호화를 사용하면 공격자가 데이터를 도용하는 것이 거의 불가능해질 수 있습니다. 그러나 공격자는 데이터베이스에서 DOS/DDoS 공격을 직접 실행할 수 있습니다. 좋은 생각이 아닙니다!

  2. 다른 모바일 장치 (iPhone, Symbian, BlackBerry 등)를 연결하려는 경우 해당 장치에서 SQL 연결을 생성 할 수 있어야합니다. iPhone은 Java를 기본적으로 지원하지 않습니다 (예를 들어 내 메모리에서). 그래서 iPhone을 SQL 서버에 연결하는 방법을 찾아야합니다. 블랙 베리가 더 쉬울 수도 있지만 심비안은 운이 좋지 않을 것이다. 따라서 데이터베이스에 연결하는 각 장치에 대한 사용자 지정 솔루션을 거의 만들어야합니다. 유지 보수

나쁜 아이디어로드 데이터베이스를 조작 할 수있는 웹 서비스 또는 사용자 정의 TCP/IP 서버를 만듭니다. 장치에서이 웹 서비스/서비스에 연결하십시오. 웹 서비스는 갈 길이 멀다. 오늘날 기기의 90 % 이상이 기본적으로 웹 서비스 호출을 수행 할 수 있습니다.

+0

, 감사합니다. – WaterBoy

+0

@dcaswell 조금 더 설명해 주셔서 감사합니다. – Namphibian

4

SQL 데이터베이스와 통신하기 위해 webservice를 사용해야한다고 생각합니다. runSomeScalarQuery 또는 runOneTabularQuery와 같은 일반적인 메소드를 웹 서비스에서 정의하고 자체 정의 된 객체와 같은 자체 정의 된 프로토콜을 통해 데이터베이스 응답을 보낼 수 있습니다.

0

테스트를 위해 필요하거나 다른 옵션이 없기 때문에 외부 데이터베이스에 연결할 수 있습니다. 데이터 액세스가 너무 무거울 경우 대부분의 경우 정상적으로 작동합니다.

  • 다운로드 여기에서 드라이버 : http://dev.mysql.com/downloads/connector/j/3.0.html (일부 새로운 사람이있다, 그러나 이것은 완벽하게 작동한다)는 "libs가"폴더가 나던 프로젝트, 지금 만드는 경우
  • 합니다.
  • 다운로드 한 파일의 압축을 풀고 mysql-connector-java-3.0.17-ga-bin 파일을 복사하십시오.> 프로젝트에서
    • 오른쪽 클릭 경로> 빌드 구성 빌드 경로
    • 탭 라이브러리> 추가 JAR
    • 검색 폴더를 LIBS와 jar 파일을 선택하려면 : libs와 폴더에 항아리
    • 빌드 경로에 추가
  • 일단 준비가되면 프로그래밍을 진행할 수 있습니다. 안드로이드는 별도의 스레드에서 네트워크 액세스를하도록 강요하므로 스레드를 생성하는 방법을 선택해야합니다. 예를 들어 AsynkTask을 사용하고 코드를 doInBackground 메소드에 추가 할 수 있습니다. 브릴리언트

    private static final String url = "jdbc:mysql://{URL_SERVER}/{BASE_DATOS}"; 
    private static final String user = "usuario"; 
    private static final String password = "contraseña"; 
    int count=0; 
    try { 
        // The newInstance() call is a work around for some broken Java implementations 
        //this creates some static objects that we need. 
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        Connection con = DriverManager.getConnection(url, user, password); 
        Statement st = con.createStatement(); 
        ResultSet rs = st.executeQuery("QUERY"); 
        while (rs.next()) { 
          //in every iteration we have a result 
          //if query is a Select, for instance 
          //"select one_column, another_column from ..." 
          //remember that rs has functions such as 
          //rs.getString(0) 
          //rs.getDouble(1) 
          //etc, that get the index of the columns in the select 
          //and cast it to the specific type 
    
          //here we do whatever we need with the results, 
          //and probably keep track of the progress with something like 
         // publishProgress(++count); 
    
          // end early if asynctask was cancel() 
          if (isCancelled()) 
         break; 
    
        } 
    } 
    
    catch (Exception e) { 
    e.printStackTrace(); 
    } 
    
관련 문제