安卓通过WebService读写MySQL

安卓通过GET,POST提交数据到PHP操作MySQL

前两天接了个毕设项目(一部分),需要安卓通过WebService读写MySQL。
因为之前自己写操作MySQL都是直连的,也没接触过PHP这方面,所以项目完成后来做个笔记和总结

搭建PHP服务器

这里我使用的是小皮面板“phpstudy”,操作起来很方便,不用自己去配置。
进去安装MySQL、php和phpMyAdmin就可以运行。
这里不细做赘述,毕竟大佬都是自己搭建,小皮对于新手还是是很容易搭建的。

创建MySQL表

点击要创建表的数据库,然后点击SQL栏目,在输入框输入代码,执行。

create table test(
number int(10) NOT NULL AUTO_INCREMENT,
name varchar(20),
phonenumber int,
PRIMARY KEY (id)
);

创建的表格样式如下:

id name number
1 小明 15866995522
2 中国移动 10086
3 李惬意 13855441166

在网站目录新建php文件

MySQL表创建好之后,就要写PHP来操作表格了。以小皮面板为例,安装盘/D:\xp.cn\www\wwwroot\admin\localhost_80\wwwroot\下新建一个get.php来读取MySQL表

<?php
$servername = "localhost";//数据库地址
$username = "root";//用户名
$password = "root";//密码
$sqlname = "test";//数据库
 
// 创建连接
$conn = new mysqli($servername, $username, $password);
 
// 检测连接
if ($conn->connect_error) {
    
    
    die("连接失败: " . $conn->connect_error);
} 
//echo "连接成功";

mysqli_select_db($conn, $sqlname); 
mysqli_query($conn,"set names 'utf8';");
$sql = mysqli_query($conn, 'select * from phonelist;'); //查询test数据库下的phonelist表
if (!$sql) {
    
    
    printf("Error: %s\n", mysqli_error($conn));
    exit();
}
while( $row = mysqli_fetch_array($sql) )
$output[] = $row;
echo (json_encode($output));//编码成json并输出
mysqli_close($conn);
?>

再建一个post.php

<?php
$servername = "localhost";//数据库地址
$username = "root";//用户名
$password = "root";//密码
$sqlname = "test";//数据库名
// 创建连接
$conn = new mysqli($servername, $username, $password);
 
// 检测连接
if ($conn->connect_error) {
    
    
    die("连接失败: " . $conn->connect_error);
} 
//echo "连接成功";
mysqli_select_db($conn, $sqlname); 
$sql = "INSERT INTO phonelist (name, phonenumber)
VALUES ('$_POST[name]',' $_POST[number]')";//获取传来的数据
if ($conn->query($sql) === TRUE) {
    
    
    echo "新记录插入成功";
} else {
    
    
    echo "Error: " . $sql . "<br>" . $conn->error;
}
mysqli_close($conn);
?>

PHP就这两页,会整合的话还可以放到一页里面,而且我有点懒… demo写完就直接用了,连个连接类都没写,一页一个连接… 想排版的可以自己把连接代码拖出去新建一个类

安卓和WebService连接

网络操作在主线程会崩溃,需要放到一个新线程来完成操作,然后UI更新又坑了我一下… 莫名其妙的报错,但是不耽误使用… 最后才发现是我放到子线程去更新ListView了…
TestActivity这里写的是查询MySQL表返回JSON到安卓,安卓这边再解析JSON并放到ListView显示
两个EditText用来提交数据到post.php插入到数据库表格中…
布局文件我就不放了,Activity代码简单易懂,而且总共也没几个控件

public class TestActivity extends AppCompatActivity {
    
    
    Button get;
    Button post;
    EditText name;
    EditText number;
    ListView contactsview;
    List<String> contactsList = new ArrayList<>();//存放数据
    ArrayAdapter<String> adapter;
    private String response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initview();
    }

    private void initview(){
    
    

        name = findViewById(R.id.name);
        number = findViewById(R.id.number);
        contactsview = findViewById(R.id.contacts_view);
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contactsList);
        contactsview.setAdapter(adapter);
        get = findViewById(R.id.get);
        get.setOnClickListener(new Button.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                new Thread(new Runnable(){
    
    
                    @Override
                    public void run(){
    
    
                        response=Get();
                    }
                }).start();
            }
        });
        post = findViewById(R.id.post);
        post.setOnClickListener(new Button.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                Post();
            }
        });
    }

    private String Get(){
    
    
        contactsList.clear();
        HttpURLConnection con=null;
        InputStream in=null;
        String      path="http://192.168.0.114/get.php";
        try {
    
    
            con= (HttpURLConnection) new URL(path).openConnection();
            con.setConnectTimeout(5000);
            con.setReadTimeout(5000);
            con.setDoInput(true);
            con.setRequestMethod("GET");
            if(con.getResponseCode()==200){
    
    
                in=con.getInputStream();
                BufferedReader  br=new BufferedReader(new InputStreamReader(in));
                StringBuilder sb=new StringBuilder();
                String line=null;
                while ((line=br.readLine())!=null){
    
    
                    sb.append(line+"\n");
                }
                try{
    
    
                    JSONArray jsonArray = new JSONArray(sb.toString());
                    for(int i = 0;i < jsonArray.length();i++){
    
    
                        JSONObject jsonObject = (JSONObject) jsonArray.get(i);
                        String fromName = jsonObject.getString("name");
                        String fromNumber = jsonObject.getString("phonenumber");
                        contactsList.add(fromName + "\n" + fromNumber);
                    }
                    updateView();
                    Log.e("解析json数据", "内容已更新");
                }catch (Exception e){
    
    
                    e.printStackTrace();
                    Log.e("解析json数据", "解析网络数据异常");
                }
                return sb.toString();
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return null;
    }

    private void updateView(){
    
    
        Thread.currentThread().setName("updateView");
        TestActivity.this.runOnUiThread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                adapter.notifyDataSetChanged();
            }
        });
    }

    public void Post(){
    
    
        new Thread(new Runnable(){
    
    
            @Override
            public void run(){
    
    
                String posname = name.getText().toString();
                String posnumber = number.getText().toString();
                StringBuilder sb = new StringBuilder();
                URLConnection conn;
                BufferedReader br = null;
                try{
    
    
                    URL posturl = new URL("http://192.168.0.114/post.php");
                    conn = posturl.openConnection();//创建连接
                    conn.setDoInput(true);//post请求必须设置
                    conn.setDoOutput(true);//post请求必须设置
                    OutputStream out=conn.getOutputStream();
                    out = new DataOutputStream(conn
                            .getOutputStream());//输出流
                    String params="name="+posname+'&'+"number="+posnumber;
                    out.write(params.getBytes());//输出流写入请求参数
                    out.flush();
                    out.close();
                    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));//获取输入流
                    String line;
                    while ((line = br.readLine()) != null) {
    
    
                        sb.append(line);
                    }
                    System.out.println(sb.toString());
                }catch(Exception e){
    
    e.printStackTrace();}
            }
        }).start();
    }
}

总结

一直写的都是安卓代码,一下接触到WebService还真的无从下手。 插入和查询都让我在网上翻了半天资料,大多都是过时的代码,放到网站上运行就报错… 相对于来说… 还是经常接触的安卓代码比较熟悉,知道该怎么去写… 但是还是会犯小错误… 继续努力吧…

猜你喜欢

转载自blog.csdn.net/qq_27082471/article/details/115058119