2012-05-21 40 views
6

Tôi có thể truy cập cơ sở dữ liệu SQL từ xa (trên máy chủ web) trực tiếp từ một chương trình Android không? tức là chỉ cần mở kết nối với tất cả các thông số bắt buộc và sau đó thực hiện truy vấn SQL?Truy cập Android vào cơ sở dữ liệu SQL từ xa

Đây là một chương trình riêng tư (không có sẵn cho công chúng) chỉ có sẵn trên thiết bị cầm tay được chỉ định, vì vậy tôi không lo lắng về việc bên thứ ba nhận được quyền truy cập cơ sở dữ liệu.

Nếu có - tôi cần thư viện nào trong Java?

Cảm ơn.

Trả lời

18

Câu hỏi này đã xuất hiện nhiều lần. Bạn có thể kết nối thiết bị Android của bạn trực tiếp với máy chủ SQL nếu bạn triển khai trình điều khiển JDBC MSSQL cho thiết bị Android của mình và sau đó tiếp xúc trực tiếp với máy chủ SQL của bạn với internet. Nếu trình điều khiển MSSQL hoạt động bình thường trên Android là một vấn đề hoàn toàn khác.

Đó là cách bạn có thể thực hiện. Tuy nhiên đây là lý do tại sao đó là một ý tưởng tồi.

  1. Bạn đang hiển thị máy chủ SQL trực tiếp lên internet. Trừ khi bạn mã hóa dữ liệu giữa máy chủ MSSQL và thiết bị Android của bạn sẽ dễ dàng cho một hacker xác định để ngửi luồng dữ liệu TDS giữa thiết bị và MSSQL và đảo ngược kỹ sư và ăn cắp dữ liệu của bạn. Mã hóa có thể sẽ khiến cho kẻ tấn công cướp dữ liệu của bạn khó hơn nhiều. Tuy nhiên, kẻ tấn công vẫn có thể khởi động trực tiếp tấn công DOS/DDOS trên cơ sở dữ liệu của bạn. Không phải là một ý tưởng hay!

  2. Nếu bạn dự định kết nối các thiết bị di động khác (iPhone, Symbian, BlackBerry vv), bạn cũng sẽ cần có khả năng tạo kết nối SQL từ các thiết bị đó. iPhone không hỗ trợ Java nguyên bản (từ bộ nhớ của tôi) cho ví dụ, do đó bạn sẽ cần phải tìm một cách để kết nối iPhone với máy chủ SQL. BlackBerry có thể dễ dàng hơn nhưng Symbian bạn sẽ không may mắn. Vì vậy, bạn sẽ cần phải gần như tạo ra một giải pháp tùy chỉnh cho mỗi thiết bị kết nối với cơ sở dữ liệu của bạn. tải ý tưởng tồi bảo trì

Tạo một máy chủ webservice hoặc tùy chỉnh TCP/IP mà có thể thao tác cơ sở dữ liệu của bạn. Kết nối với dịch vụ web/dịch vụ này từ thiết bị của bạn. Webservices là con đường để đi. Hơn 90% thiết bị trong những ngày này có khả năng thực hiện cuộc gọi webservice.

+0

Brilliant, cảm ơn. – WaterBoy

+0

@dcaswell Cảm ơn bạn đã chọn nó làm rõ hơn một chút. – Namphibian

4

Tôi nghĩ bạn phải sử dụng dịch vụ web để giao tiếp với cơ sở dữ liệu SQL. bạn có thể định nghĩa các phương thức chung như runSomeScalarQuery hoặc runOneTabularQuery và ... trong webservice đó và gửi các phản hồi cơ sở dữ liệu thông qua giao thức tự định nghĩa như một đối tượng tự định nghĩa.

0

Thực hành rất kém nhưng nếu bạn cần nó cho mục đích thử nghiệm, hoặc vì bạn không có tùy chọn nào khác, bạn vẫn có thể kết nối với cơ sở dữ liệu bên ngoài. Và nó sẽ hoạt động tốt trong hầu hết các trường hợp nếu truy cập dữ liệu không quá nặng.

  • Tải về trình điều khiển từ đây: http://dev.mysql.com/downloads/connector/j/3.0.html (có một số cái mới hơn, nhưng điều này đang làm việc một cách hoàn hảo)
  • nếu dự án của bạn doesnt có một "libs" thư mục, tạo ra nó bây giờ.
  • giải nén tệp bạn đã tải xuống và sao chép tệp mysql-connector-java-3.0.17-ga-bin.jar vào thư mục libs
  • thêm nó vào việc xây dựng đường dẫn:
    • Nhấp chuột phải vào project> Build Path> Configure Build Path
    • Tab Libraries> Add JAR
    • Browse để libs thư mục và chọn các file jar
  • Khi điều này đã sẵn sàng, chúng tôi có thể tiếp tục với chương trình. Như chúng ta đã biết, Android buộc chúng tôi thực hiện truy cập mạng trong một chuỗi riêng biệt, vì vậy chúng tôi phải chọn cách tạo Chủ đề, ví dụ: chúng tôi có thể sử dụng AsynkTask và thêm mã của chúng tôi vào phương thức 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(); 
    } 
    
Các vấn đề liên quan