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