Demo code đăng nhập ứng dụng android có kết nối SQL server

[Mã code 20087]
  1 Đánh giá    Viết đánh giá
 560      8546      13
Phí tải: Miễn phí
Danh mục
Thể loại
Nhóm code
Ngày đăng
25-7-2018
Loại file
Full code
Dung lượng
18.9 MB

Nhiều bạn thắc mắc là Android có thể giao tiếp với SQL Server như nền tảng .Net được không ? Thì câu trả lời chính là: Được. Ứng dụng demo này đăng nhập vào tài khoản sử dụng dữ liệu từ SQL Server.


MÔ TẢ CHI TIẾT

Để làm được bài này, các bạn cần có ít nhiều hiểu cơ bản về Activity, chuyển đổi giữa các Activity, khái niệm về Intent trong Android. Đồng thời, tui cũng ứng dụng luôn xử lý đa tiến trình với AsyncTask mặc dù yêu cầu truy vấn chỉ là một bản ghi nhưng mà luyên tập cho nó nhuyễn vì trước sau cũng phải xài anh này nhiều mà.

Bắt đầu với khởi tạo một ứng dụng Android trên Android Studio, bao gồm 2 Activity dùng để chuyển đổi giữa 2 màn hình ứng dụng. File class HASH dùng để băm chuỗi mật khẩu, SERVER chưa thông tin kết nối SQL Server và 2 class Activity dùng để xử lý trên giao diện ứng dụng Android.

File XML Activity main: 

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--?xml version="1.0" encoding="utf-8"?-->

File XML ActivityUser:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--?xml version="1.0" encoding="utf-8"?-->

Các file java:

SERVER.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.example.erp_tuyen.loginsql;
 
import android.annotation.SuppressLint;
import android.os.StrictMode;
import android.util.Log;
import android.widget.SimpleAdapter;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
 
/**
 * Created by Erp-Tuyen on 03/01/2018.
 */
 
public  class SERVER {
//cấu trúc của jtds là nó phải như zị
    static String ip = "172.20.10.2"; //server IP
    static String classs = "net.sourceforge.jtds.jdbc.Driver"; //khóa này không thay đổi
    static String db = "Database_Name";//tên database
    static String un = "User_name"; //user đăng nhập vào SQL server mặc định là sa
    static String password = "**********";// mật khẩu đăng nhập
 
    static String z;
    static Boolean isSuccess;
 
 
    @SuppressLint("NewApi")
    public static Connection Connect() {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection conn = null;
        String ConnURL = null;
        try {
 
            Class.forName(classs);
            ConnURL = "jdbc:jtds:sqlserver://" + ip +";databaseName="+ db + ";user=" + un+ ";password=" + password + ";";
            //ConnURL="jdbc:mysql://{hostname}:{port}"
            conn = DriverManager.getConnection(ConnURL);
            ///Connection conn2 = DriverManager.getConnection(url, username, password);
 
        } catch (SQLException se) {
            Log.e("ERROR1","Không thể tải lớp Driver! "+ se.getMessage());
        } catch (ClassNotFoundException e) {
            Log.e("ERROR2","Xuất hiện vấn đề truy cập trong khi tải! "+ e.getMessage());
        } catch (Exception e) {
            Log.e("ERROR3", "Không thể khởi tạo Driver! "+e.getMessage());
        }
        return conn;
 
    }
 
}

HASH.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.example.erp_tuyen.loginsql;
 
/**
 * Created by Erp-Tuyen on 03/01/2018.
 */
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
/**
 * Created by Erp-Tuyen on 02/01/2018.
 */
 
public class HASH {
 
    public static final String md5(final String s) {
        final String md5 = "MD5";
        try {
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest
                    .getInstance(md5);
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();
 
            // Create Hex String
            StringBuilder hexString = new StringBuilder();
            for (byte aMessageDigest : messageDigest) {
                String h = Integer.toHexString(0xFF & aMessageDigest);
                while (h.length() < 2)
                    h = "0" + h;
                hexString.append(h);
            }
            return hexString.toString();
 
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
 
}

UserActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.example.erp_tuyen.loginsql;
 
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class UserActivity extends Activity {
 
    EditText edtOldPw, edtNewPw, edtReNewPw;
    TextView tvUser,tvTitleUs;
    Button btnSubmit;
    ProgressBar progressBar;
 
    String un,pw,hoten;
    Boolean isUpdated;
 
    String z;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);
 
        edtOldPw=(EditText)this.findViewById(R.id.edtOldPw);
        edtNewPw=(EditText)this.findViewById(R.id.edtNewPw);
        edtReNewPw=(EditText)this.findViewById(R.id.edtReNewPw);
        btnSubmit=(Button)this.findViewById(R.id.btnSubmit);
        tvUser=(TextView)this.findViewById(R.id.tvUser);
        tvTitleUs=(TextView)this.findViewById(R.id.tvTitleUs);
        progressBar=(ProgressBar)this.findViewById(R.id.progressBar);
 
        progressBar.setVisibility(View.GONE);
 
        Bundle extras=getIntent().getExtras(); //dùng cái này để hứng gói tin hồi nãy.
        un=extras.getString("USERNAME","N/A");//lấy giá trị của cái key là USERNAME
        pw=extras.getString("PASSWORD","N/A");// như trên
        hoten=extras.getString("HOTEN","N/A");// vẫn rứa
 
        tvUser.setText(hoten);
 
        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DoUpdate up= new DoUpdate();
                up.execute("");//dùng gọi... ak mà nói trong bài trước rồi
            }
        });
    }
 
    void finishUpdate(){ //tạo gói Intent để gửi trả cho cái thằng kia nãy nó gửi và nó đang đợi trả
        if(isUpdated){
            Intent intent= new Intent(this,MainActivity.class); //bắn lại cho thằng MainActivity.class
            intent.putExtra("PASSWORD",pw);
            this.setResult(RESULT_OK,intent);
            super.finish(); //k có cái này thì nó k gửi trả, nghĩa là bên kia sẽ nghĩ là chưa có gửi tới
        }
    }
 
    public class DoUpdate extends AsyncTask {
        @Override
            protected String doInBackground(String... strings) {
 
            String oPw,nPw,rnPw;
            oPw=edtOldPw.getText().toString();
            nPw=edtNewPw.getText().toString();
            rnPw=edtReNewPw.getText().toString();
 
            isUpdated=false;
            if(oPw.trim().equals("")||nPw.trim().equals("")||rnPw.trim().equals("")){
                z="Vui lòng nhập đủ thông tin";
            }else if(!oPw.equals(pw)){
                z="Mật khẩu cũ không đúng !";
            }else if(!nPw.equals(rnPw) ){
                z="Mật khẩu không trùng khớp !";
            }
            else if(pw.equals(rnPw) ){
                z="Mật khẩu mới phải khác với mật khẩu cũ !";
            } else {
                try {
                    Connection conn = SERVER.Connect();
                    if (conn != null) {
                        int resultSet;
                        String query = "Update tbl_user set matkhau='" + HASH.md5(rnPw)  + "' where  matkhau='" + HASH.md5(pw) + "' and tendangnhap='"+un+"'";
                        Statement stmt = conn.createStatement();
                        resultSet= stmt.executeUpdate(query);//thực thi lệnh, trả về số dòng thực hiện dc
 
                        if(resultSet==1)
                        {
                            z="Mật khẩu đã được thay đổi ! ";
                            pw=rnPw;
                            isUpdated=true;//lại đánh dấu chủ quyền
                            conn.close();
                        }
                        else
                        {
                            z="Không thể hoàn tất thay đổi mật khẩu ! ";
                        }
                    } else {
                        z="Cập nhật không thành công ! Lỗi kết nối !";
                    }
                } catch (Exception ex)
                {
                    Log.e("ERUs", ex.getMessage());
                }
            }
            return z;
        }
 
 
        @Override
        protected void onPreExecute() {
            progressBar.setVisibility(View.VISIBLE);
            // TODO Auto-generated method stub
            super.onPreExecute();
        }
 
        @Override
        protected void onProgressUpdate(String... values) {
            //super.onProgressUpdate(values);
            //Cập nhật thông tin như thay đổi giá trị progressBar ở đây !
        }
 
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(UserActivity.this, s, Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            finishUpdate();//gọi hàm trả lui gói Intent
        }
    }
 
}

Và MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.example.erp_tuyen.loginsql;
 
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class MainActivity extends Activity {
 
    EditText edtUserName, edtPaddword;
    Button btnLogin;
    ProgressBar pgbLoading;
    TextView tvResult;
    ResultSet resultSet;
 
      final int CHAN_PW_CODE=4; //Code dùng để gửi gói Intent qua Activity_User
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        btnLogin=(Button)this.findViewById(R.id.btnLogin);
        edtUserName=(EditText)this.findViewById(R.id.edtUserName);
        edtPaddword=(EditText)this.findViewById(R.id.edtPassword);
        pgbLoading=(ProgressBar)this.findViewById(R.id.pgbLoading);
        tvResult=(TextView)this.findViewById(R.id.tvResult);
 
        pgbLoading.setVisibility(View.GONE);
 
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DoLogin  doLogin = new DoLogin();
                doLogin.execute("");//Thực thi doLogin.doInBackground();
            }
        });
    }
 
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {//Hàm này sẽ xử lý nếu khi mình gửi Intent là startActivityForResult, nhấn F8, bỏ qua cái này, xem xuống dưới trước
        if (requestCode == CHAN_PW_CODE) { //Kiểm tra xem code trả về có đúng ban đầu không này không
            // Phài chắc chắn là thành công mới gửi
            if (resultCode == RESULT_OK) {
                String rs=data.getStringExtra("PASSWORD");
                Toast.makeText(this,"Mật khẩu đã đổi thành "+ rs ,Toast.LENGTH_LONG).show();
                edtPaddword.setText(rs);
                btnLogin.setVisibility(View.VISIBLE);
            }
        }
    }
 
    //---------------------------------------------------------------------------------------------
    public class DoLogin extends AsyncTask
    {
 
        String z = ""; //cái này dùng để hứng kết quả khi chạy hàm truy vấn tới SQL Server
        String hoten=""; //Cái này sẽ chứa họ tên đầy đủ khi truy vấn được
        Boolean isSuccess = false; //Biến nhận biết là có truy vấn thành công hay không
 
        String userid = edtUserName.getText().toString(); // biến cục bộ, xài cục bộ
        String password = edtPaddword.getText().toString(); // như trên
 
 
        @Override
        protected void onPreExecute() {
            pgbLoading.setVisibility(View.VISIBLE); // bật cái con chạy lên
            btnLogin.setVisibility(View.GONE);//Ẩn button đi
        }
 
        @Override
        protected String doInBackground(String... params) {
        try {
                Connection con = SERVER.Connect(); //khởi tạo kết nối tới server, SERVER chính là class riêng, tìm trong table java
                if (con == null) {
                    z = "Không thể kết nối với Server"; //Tiếng Việt :D
                } else {
                String query = "select * from view_user where tendangnhap='" + userid + "' and matkhau='" + HASH.md5(password) + "'";
                //trên đây là câu truy vấn
                    Statement stmt = con.createStatement(); //blah blah blah
                    resultSet = stmt.executeQuery(query); //thực thi và trả về một cục ResultSet, nó là gì thì Google, tui chịu
 
                    //ResultSet rs = SERVER.executeQuery(query);
                    if(resultSet.next())//nếu trong resultset không null thì sẽ trả về True
                    {
                        hoten=resultSet.getString("hoten");//Hàm lấy giá trị của tên cột (trường: field name) truyền vào
                        z = "Hi, " + hoten; //Hey, i'm TONA
                        //tvResult.setText(hoten);
                        isSuccess=true; //Oánh dấu chủ quyền, làm dấu thôi, để biết là hàm nó chạy tới đây, xíu mình dùng biến này kiểm tra coi thử chạy tới đây hay không đó mà, chạy tới đây nghĩa là thành công rồi đó.
                        con.close();//Đấm vỡ mồm SERVER xong thì phải băng bó cho nó.
                    }
                    else
                    {
                        z = "Tài khoản không tồn tại !";//Lại Tiếng Việt
                        isSuccess = false; //Chạy tới đây là hỏng rồi
                    }
                }
            }
            catch (Exception ex)
            {
                isSuccess = false;
                z = "Lỗi !";
            }
            return z;//Trả về, thứ này chính là cái doInBackground(String... params), nó buộc mình phải trả về String, do tui khai báo là String thôi, nếu ban đầu khai kiểu khác thì nó sẽ bắt trả về kiểu khác, trong bài trước mình trả về null, vì mình chẳng cần bắt gì cả, chỉ chạy thôi.
        }
 
        @Override
        protected void onProgressUpdate(String... values) {
            //super.onProgressUpdate(values); //Thường dùng để thay đổi trạng thái tiến trình đang làm tới % blah blah, tui k xài
        }
 
        @Override
        protected void onPostExecute(String r) {// sau khi tiến trình kết thúc thì sẽ gọi tới hàm này
            pgbLoading.setVisibility(View.GONE);//Tắt cái cục xoay xoay đi
            Toast.makeText(MainActivity.this,r,Toast.LENGTH_SHORT).show(); // cái r chính là cái mà nó lấy từ cái hàm doInBackground(String... params), hàm này return z (String), nó sẽ quăng qua hàm này để thực hiện cái bên trong
            if(isSuccess) {//kiểm tra chủ quyền của mình có tới vị trí đánh dấu nãy không :D
                Toast.makeText(MainActivity.this,r,Toast.LENGTH_SHORT).show();
 
                Intent intent= new Intent(MainActivity.this, UserActivity.class);//tạo ra một "gói" Intent gửi từ this đến UserActivity.class
                //setContentView(android.view.View);
                intent.putExtra("USERNAME",userid);//nhét cái userid vô intent và đặt khóa là USERNAME
                intent.putExtra("PASSWORD",password);//như trên
                intent.putExtra("HOTEN",hoten);//như rứa
                startActivityForResult(intent,CHAN_PW_CODE);//gửi đi, có đợi trả về, nếu trả về sẽ chạy cái hồi nãy nhấn F8
                //startActivity(intent); kiểu này sẽ không đợi trả về
                //intent
            }
        }
    }
 
}

Như vậy là hoàn tất ứng dụng, và có thể chạy thử được rồi.

 


XEM THÊM ==> Hướng dẫn cài đặt chi tiết

 

HÌNH ẢNH DEMO

Lập trình Android,Ứng dụng Android,Android giao tiếp với SQL Server

Lập trình Android,Ứng dụng Android,Android giao tiếp với SQL Server

Lập trình Android,Ứng dụng Android,Android giao tiếp với SQL Server

Nguồn: Sharecode.vn



HƯỚNG DẪN CÀI ĐẶT

Android app không thể giao tiếp một cách trực tiếp với SQL Server, bởi đơn giản là do SQL Server thuộc về Microsoft còn Android là con cưng của Google, chúng ta có thể viết một ứng dụng bằng Java, mà Java có lại hỗ trợ kỹ thuật cho phép người dùng có thể sử dụng ứng dụng Android để thao tác với cơ sở dữ liệu trên SQL Server. Để làm được điều này, lập trình viên phải add thư viên jTDS vào ứng dụng Android của mình.

Các bạn có thể download ứng mọi phiên bản của jTDS tại đâysourceforge.net/projects/jtds/files/jtds/

Một vài lưu ý sau:

  • Thư viện này chỉ thấy được SQL Server có Instance là mặc định của máy. Nhiều bạn cài SQL Server với Instance dạng COMPUTER_NAME\INSTANCE_NAME thì nó sẽ báo là không tìm thấy được Server.
  • Chỉ chấp nhận là IP Server. Ví dụ Instance mặc định của mình là TONA, nhưng IP máy mình là 172.20.10.2 thì bắt buộc mình phải để là IP 172.20.10.2. IP này phải đăng nhập  được vào SQL Server nhé.
  • Hãy tắt tường lửa nếu bạn test trên máy nhà.
 
 
LINK DOWNLOAD

ANDROID-connect-SQL-Server.rar [18.9 MB]

File đã kiểm duyệt
     Báo vi phạm bản quyền
Pass giải nén (Nếu có):
sharecode.vn
DOWNLOAD
(Miễn phí)
Bạn có code hay
ĐĂNG BÁN NGAY

BÌNH LUẬN



ĐÁNH GIÁ


ĐIỂM TRUNG BÌNH

5
1 Đánh giá
Code rất tốt (1)
Code tốt (0)
Code rất hay (0)
Code hay (0)
Bình thường (0)
Thành viên
Nội dung đánh giá
17:37 - 25/7/2018
Code rất tốt
Code rất tốt và phù hợp để phát triển

 HỖ TRỢ TRỰC TUYẾN