概述:在Android-app端:发布简短数据,php接口与android数据接收/发送,php将数据用sql语句插入数据库
关键字:Android,php,mysql,BottomNavigationItemBar
遇到的坑:android+mysql直接尝试用jdbc遇到了坑,使用AndroidStudio去完成这个任务总是会报错,在查找很长时间之后,发现Android+jdbc+mysql,最好在eclipse上尝试,如果AndroidStudio有成功可以分享给大家
1.BottomNavigationItemBar的使用
2.mysql数据库创建
3.php文件
4.Android-app端提交数据获取数据以及Json解析的逻辑代码
5.某些注意的地方
(代码大概是2016-12-15前后,某些框架技术更新太快,仅做整理参考之用)
-------------------------------------------------------------------------------------------------------------------------
1.BottomNavigationItemBar
这个东西菜鸡小王认为略牛逼,好厉害的很,奈何没有找到一篇详细介绍的,偶尔遇到,用了一下,真是牛。
Bottom Navigation:底部导航,Google在自己推出的Material design中增加了Bottom Navigation导航控制,这样的话稍稍有一点统一的感觉,那么这个效果是什么样的,和QQ的底部导航基本一致或者说是一毛一样啊,而且还有各种效果设置
1.1在Gradle Scripts - build.gradle(Module:app) 的dependencies{中添加
compile 'com.ashokvarma.android:bottom-navigation-bar:1.0.0'
1.2布局
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/bottom_navigation_bar"
/>
1.3逻辑代码中与BottomNavigationBar相关代码
1.3.1
private BottomNavigationBar bottom_bar;
bottom_bar= (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);
bottom_bar.addItem(new BottomNavigationItem(R.mipmap.show,getString(R.string.show)))
.addItem(new BottomNavigationItem(R.mipmap.find,getString(R.string.find)))
.addItem(new BottomNavigationItem(R.mipmap.look,getString(R.string.look)))
.setFirstSelectedPosition(1)
.initialise();
亲们可以通过bottom_bar. 来看一看有哪些功能函数,以上只是部分,addItem就是加导航块,setFirstSelectedPosition就是设置默认导航在哪个位置
还有设置背景颜色,动作等多种函数
当然记住最后一个一定要有.initialise();
1.3.2
设置选择监听函数
bottom_bar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
@Override
public void onTabSelected(int position) {
//txt_main.setText(theNames.get(position));
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
switch (position){
case 0:
theShow=new ShowFragment();
ft.replace(R.id.mainFragment,theShow);
break;
case 1:
theFind=new FindFragment();
ft.replace(R.id.mainFragment,theFind);
break;
case 2:
theWatch=new WatchFragment();
ft.replace(R.id.mainFragment,theWatch);
break;
}
ft.commit();
配合Fragment可以达到不同导航块指向不一样的fragment,具体逻辑代码可以自己写
{首先是在BottomNavigation调用相关函数之后就用了一个setDefaultFragment,在这个里面设置默认的Fragment和position=1 对应,之后能选择监听函数里面用ft.replace来替换相应的Fragmnet达到导航作用}
1.3.3
贴一个Fragment代码
public class FindFragment extends Fragment {
EditText thetitle,thecontent;
String title_up,content_up;
Button bt_up;
String theurl;
String params,params02;
public int key=0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view=inflater.inflate(R.layout.find_fragment, container, false);
TextView txt_main= (TextView) view.findViewById(R.id.tv_add);
txt_main.setText("发布");
//链接php代码省略
return view;
}
}
2.Mysql数据库的创建
在这个地方使用了phpmyadmin直接可视化创建表了,具体的搭建,在linux上可以用一键脚本给服务器安装lnmp/lamp环境或者在本机上安装mysql服务
2.1创建一个用户:
mfx1126%是ALL PRIVILEGES是 --->创建一个用户名/密码,使其能够通过任意主机进行链接,这样的话,从任意主机发出的链接请求都能够顺利的链接数据库,其次就是权限问题,按照功能实现配置权限
2.2创建数据表:
这里设置的很简单一个id,title,content,记得配置一下utf8
主键设置id,且给其自增属性
title和content设置utf8_unicode_ci,确保中文无乱码
2.3其他
3.php文件的使用
不会php啦,然后查了很长时间,结合别人的代码,总之是搞出来一份貌似没有问题的代码啦。(暂停打卡)
(开工) 不太会php,基本讲解不了,直接贴代码啦
3.1 conn.php
主要进行数据库连接,通过该文件完成连接数据库
<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
$conn=mysql_connect("localhost","root","10002I321456DC89hjcom") or die("数据库服务器连接错误".mysql_error());
mysql_select_db("mfx1126",$conn) or die("数据库访问错误".mysql_error());
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET CHARACTER_SET_RESULT=utf8");
?>
具体可以参考php-mysql相关函数介绍,因为文件和数据库在同一服务器下,所以用localhost可以进行连接,这样的话,前面的用户可以设置为本地主机(localhost访问而非任意主机,可以增强一点安全性)
3.2 updata.php
<?php
/*
*用户登录,服务器进行的处理
*/
include("conn.php");
mysql_select_db("mfx1126");
$gettitle=$_POST['title'];//客户端post过来的标题
$getcontent=$_POST['content'];//客户端post过来的内容
/*INSERT INTO `data_clcy`(`title`, `content`) VALUES ([value-2],[value-3])*/
$sql=mysql_query("INSERT INTO `data_clcy`(`title`, `content`) VALUES ('".$gettitle."','".$getcontent."')");
$result=mysql_fetch_assoc($sql);
mysql_close();
?>
具体可以参考php-mysql相关函数介绍一集sql语句,主要就是
3.3 getdata.php
<?php
require 'conn.php'; //引入conn.php文件
$result = mysql_query("select * from data_clcy order by id desc"); //数据表查询
$n=0;
while ($row = mysql_fetch_array($result)) { //依次取出数据库中的信息
$arr[$n++] = array( 'title' =>$row['title'],
'content' =>$row['content'],
);
}
echo json_encode($arr); //转变为JSON格式输出
?>
order by id desc 就是属性id 按照逆序排序,也就是时间越近在数组中越前
3.4 search.php
<?php
require 'conn.php'; //引入conn.php文件
$keyword=$_POST['keyword'];
$result = mysql_query("SELECT * FROM `data_clcy` WHERE `title` LIKE '%".$keyword."%'"); //从test数据库的news数据表查询
$n=0;
while ($row = mysql_fetch_array($result)) { //依次取出数据库中的信息
$arr[$n++] = array( 'title' =>$row['title'],
'content' =>$row['content'],
);
}
echo json_encode($arr); //转变为JSON格式输出
?>
后面新加的一个查询数据库
4. Android-app端提交数据获取数据以及Json解析的逻辑代码
4.1 创建HttpUntils工具 - getJson工具函数代码:
public class HttpUntils {
public static void getJson(final String url, final Handler handler){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection coon;
InputStream is;
try {
coon= (HttpURLConnection) new URL(url).openConnection();//打开网络链接
coon.setRequestMethod("GET"); //设置发送请求方式是GRT
is=coon.getInputStream(); //返回对应输入流,获取响应内容
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
StringBuilder result=new StringBuilder(); //
while((line=br.readLine())!=null){
result.append(line);
}
Message message=new Message();
message.obj=result.toString();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public static void getJson(final String url, final Handler handler, final String keyword){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection coon;
InputStream is;
try {
coon= (HttpURLConnection) new URL(url).openConnection();//打开网络链接
coon.setRequestMethod("POST");
coon.setRequestProperty("contentType","application/x-www-form-urlencoded");
coon.setRequestProperty("Content-Length", String.valueOf(keyword.getBytes().length));
//默认为false
coon.setDoOutput(true);
coon.getOutputStream().write(keyword.getBytes());
is=coon.getInputStream(); //返回对应输入流,获取响应内容
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
StringBuilder result=new StringBuilder(); //
while((line=br.readLine())!=null){
result.append(line);
}
Message message=new Message();
message.obj=result.toString();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
4.2 提交数据 经由 php 到 mysql
{
bt_up= (Button) view.findViewById(R.id.bt_up);
theurl="http://www.xtxxobexloxl.com/weixin/updata.php";
}
{ bt_up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
thetitle= (EditText) getView().findViewById(R.id.et_title);
thecontent= (EditText) getView().findViewById(R.id.et_content);
title_up=thetitle.getText().toString();
content_up=thecontent.getText().toString();
if (content_up != null)
{
content_up=content_up.replace("&","%26");
}
params="title="+title_up+"&"+"content="+content_up;
//params02="content="+content_up;
Log.e("&&&&&&&&&&&&&&&",params);
Toast.makeText(getContext(), "正在提交......", Toast.LENGTH_SHORT).show();
new Thread(new Runnable() {
@Override
public void run() {
//点击按钮进行提交
HttpURLConnection coon=null;
try {
URL url=new URL(theurl);
//ArrayList params = new ArrayList();
//params.add(new BasicNameValuePair("title",title_up));
//params.add(new BasicNameValuePair("content",content_up));
Log.e("00",params);
coon= (HttpURLConnection) url.openConnection();
coon.setRequestMethod("POST");
coon.setRequestProperty("contentType","application/x-www-form-urlencoded");
coon.setRequestProperty("Content-Length", String.valueOf(params.getBytes().length));
//默认为false
coon.setDoOutput(true);
coon.getOutputStream().write(params.getBytes());
if(coon.getResponseCode()==200){
//Toast.makeText(getContext(), "提交成功", Toast.LENGTH_SHORT).show();
key=1;
Log.e("oo","200");
}else{
//Toast.makeText(getContext(), "提交失败,确认网络或者反馈至邮箱:892581704@qq.com", Toast.LENGTH_LONG).show();
Log.e("oo","err");
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(coon!=null){
coon.disconnect();
coon.disconnect();
}
}
}
}).start();
if(key==1){
Toast.makeText(getActivity(), "提交成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getActivity(), "提交完毕,分享页面查看数据", Toast.LENGTH_SHORT).show();
}
}
});
}
//这段代码,有点遗憾就是提交之后应该根据成功与否的情况来给出不同的代码,这一块有一点想法是php提交mysql之后应该有类似返回码或者相关的函数,然后再回传给app,根据返回内容来提示成功与否
//这段代码,还有一个就是没有做非空判断,直接点击提交仍旧能提交成功,以及无意义词组判断也没有,非空直接!=null应该可以,无意义词组用正则去简单判断一下应该可以
//这里面,数据库链接交给了php,而数据库用户名密码在php文件写死,这块可以根据功能需求来做变化
4.3 得到数据 经由 php从mysql获取
public Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
result= (String) msg.obj;
thedatas= JSON.parseArray(result,Thedata.class);
adapter.notifyDataSetChanged();
}
};
@Override
public void onAttach(Context context) {
super.onAttach(context);
MainActivity mActivity= (MainActivity) getActivity();
mActivity.setHandler(handler);
}
HttpUntils.getJson(theUrl,handler);
5.其他
-lovelovelove-