zoukankan      html  css  js  c++  java
  • android 自动更新

    package com.wlwl.yiyuan;
    
    
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.UUID;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.DownloadManager;
    import android.app.FragmentManager;
    import android.app.ProgressDialog;
    import android.content.ContentValues;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentTabHost;
    import android.support.v4.app.FragmentTransaction;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.Window;
    import android.widget.RadioGroup;
    import android.widget.Toast;
    
    
    
    
    import android.widget.RadioGroup.OnCheckedChangeListener;
    import android.widget.TabHost.TabSpec;
    import cn.jpush.android.api.JPushInterface;
    
    import com.wlwl.common.Config;
    import com.wlwl.common.FragmentHelp.OnBackListener;
    import com.wlwl.dal.D_News;
    import com.wlwl.enums.M_News;
    import com.wlwl.fragment.*;
    import com.wlwl.tools.ConvertX;
    import com.wlwl.tools.FileX;
    import com.wlwl.tools.URLX;
    import com.wlwl.tools.UtilX;
    
    
    
    @SuppressLint("NewApi")
    public class Index extends FragmentActivity implements OnBackListener {
    	 public static FragmentManager fm;
    	String newVerName = "";//新版本名称
    	 int newVerCode = -1;//新版本号
    	 String newURL = "";//新版本下载地址
    	  ProgressDialog pd = null;
    	
    	private static final String UPDATE_SERVERAPK = null;
    		// 定义FragmentTabHost对象
    		private FragmentTabHost mTabHost;
    		private RadioGroup mTabRg;
    
    		private final Class[] fragments = { index.class, division.class, users.class,setting.class };
    	
    	
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);			
    		// 去掉标题栏
    	    requestWindowFeature(Window.FEATURE_NO_TITLE);
    	    setContentView(R.layout.index);
    		initView();
    		boolean isNetWork = UtilX.isNetworkConnected(getApplicationContext());
    		if (isNetWork == true) {
    			upadte();
    		}
    				
    	}
    	
    	
    	public void upadte() {
    		
    		getServerVer();
    			
    	
    	}
    	
    	
    	 /**
         * 不更新版本
         */
        public void notNewVersionUpdate(){
            int verCode = UtilX.getVerCode(this);
            String verName = UtilX.getVerName(this);
            StringBuffer sb = new StringBuffer();
            sb.append("当前版本:");
            sb.append(verName);
            sb.append(" Code:");
            sb.append(verCode);
            sb.append("
    已是最新版本,无需更新");
            Dialog dialog = new AlertDialog.Builder(this)
            .setTitle("软件更新")
            .setMessage(sb.toString())
            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    finish();
                }
            }).create();
            dialog.show();
        }
    
    	/**
    	 * 从服务器端获得版本号与版本名称
    	 * 
    	 * @return
    	 */
    	public boolean getServerVer() {
    		try {
    
    			try {
    				new Thread(new Runnable() {
    					public void run() {
    						String url1 = Config.Url_UpdateApp; // 更新app地址
    						String aaa = URLX.GetUrl(url1); // 请求结果						
    						mHandler.obtainMessage(2, aaa).sendToTarget();
    
    					}
    				}).start();
    
    			} catch (Exception e) {
    				// TODO: handle exception
    			}
    
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			return false;
    		}
    		return true;
    	}
    
    	/**
    	 * 操作UI
    	 * */
    	private Handler mHandler = new Handler() {
    		public void handleMessage(Message msg) {// 此方法在ui线程运行
    			switch (msg.what) {
    			
    			case 2: // 更新APP
    				String s  = msg.obj.toString();
    				if (ConvertX.IsNull(s) == false) {
    
    					try {
    						JSONObject jsonObject2 = new JSONObject(s);
    						String state = jsonObject2.getString("state");
    						int rr = ConvertX.ToInt(state);
    						if (rr == 200) {						
    							JSONArray jsonArray = new JSONObject(s)
    							.getJSONArray("model");
    							for (int i = 0; i < jsonArray.length(); i++) {
    								JSONObject jsonObjectSon = (JSONObject) jsonArray
    										.opt(i);
    								String ver = jsonObjectSon.getString("ver");
    								String url= jsonObjectSon.getString("url");
    								String name = jsonObjectSon.getString("name");
    								newVerCode = ConvertX.ToInt( ver);
    								newVerName = name;
    							    newURL =   url;
    								
    							   // FileX.Write_Log(newURL);
    							    
    							    
    							    
    							    int verCode = UtilX.getVerCode(Index.this); // 系统版本
    							    Log.i("download_url",newURL);
    							    Log.i("download_name",name);
    							    Log.i("系统版本",verCode+"");
    							    Log.i("服务器版本",newVerCode+"");
    							    
    								if (newVerCode > verCode) {
    									 doNewVersionUpdate();//更新版本
    								} else {
    								
    								}
    							}
    						}
    					} catch (JSONException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				} else {
    					
    				}
    
    				break;
    			}
    		}
    	};
    
    
    	private void DownLoadApp(String Url, String Name) {
    
    		try {
    			
    			DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    
    			DownloadManager.Request down = new DownloadManager.Request(
    					Uri.parse(Url));
    
    			// 设置允许使用的网络类型,这里是移动网络和wifi都可以
    			down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE
    					| DownloadManager.Request.NETWORK_WIFI);
    			// 是否显示在通知栏
    			down.setShowRunningNotification(true);
    			// 是否显示下载界面
    			down.setVisibleInDownloadsUi(true);
    			// 设置下载后文件存放的位置
    			 down.setDestinationInExternalFilesDir(getApplication(), null,
    			 Name);
    
    			// 表示允许MediaScanner扫描到这个文件,默认不允许。
    			//down.allowScanningByMediaScanner();
    
    			down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    			down.setMimeType("application/vnd.android.package-archive");
    			// 设置为可被媒体扫描器找到
    			down.allowScanningByMediaScanner();
    			// 设置为可见和可管理
    			down.setVisibleInDownloadsUi(true);
    			// 获取此次下载的ID
    
    			// 注册广播接收器,当下载完成时自动安装
    			IntentFilter filter = new IntentFilter(
    					DownloadManager.ACTION_DOWNLOAD_COMPLETE);
    
    			down.setDestinationInExternalPublicDir("download", Name);
    			// 将下载请求放入队列
    			long reference = manager.enqueue(down);
    
    			Log.i("下载ID", reference + "");
    			
    			
    			
    
    		} catch (Exception e) {
    			Log.i("DownLoadApp(String Url , String Name)", e.getMessage());
    		}
    
    	}
    	
    	
    	 /**
        * 更新版本
        */
       public void doNewVersionUpdate(){
           int verCode = UtilX.getVerCode(this);
           String verName = UtilX.getVerName(this);
           StringBuffer sb = new StringBuffer();
           sb.append("发现新版本");          
           sb.append(",是否更新");
           
           
           AlertDialog.Builder builder = new AlertDialog.Builder(this);
    		builder.setMessage(sb.toString())
    				.setCancelable(false)
    				.setPositiveButton("更新",
    						new DialogInterface.OnClickListener() {
    							public void onClick(DialogInterface dialog,
    									int id) {
    								 pd = new ProgressDialog(Index.this);
    					                pd.setTitle("正在下载");
    					                pd.setMessage("请稍后。。。");
    					                pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    					                
    					                
    					                Toast.makeText(getApplication(), "正在下载请稍后.....",
    											Toast.LENGTH_LONG).show();
    					                DownLoadApp(newURL,newVerName);
    					               // downLoadFile(newURL);
    							}
    						})
    				.setNegativeButton("暂不更新",
    						new DialogInterface.OnClickListener() {
    							public void onClick(DialogInterface dialog,
    									int id) {
    								dialog.cancel();
    							}
    						});
    		AlertDialog alert = builder.create();
    		alert.show();
    		
           
           
           
       }
       
     
       
    
       // 初始化Fragment(FragmentActivity中呼叫)
       public static void initFragment(android.app.Fragment f){
           changeFragment(f, true);
       }
       private static void changeFragment(android.app.Fragment f, boolean init){
           android.app.FragmentTransaction ft =  fm.beginTransaction();
           ft.replace(R.id.realtabcontent, f);
           if(!init)
               ft.addToBackStack(null);
           ft.commit();
       }
       
       
       
    	private void initView() {
    		mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    		mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
    		// 得到fragment的个数
    		int count = fragments.length;
    		for (int i = 0; i < count; i++) {
    			// 为每一个Tab按钮设置图标、文字和内容
    			TabSpec tabSpec = mTabHost.newTabSpec(i + "").setIndicator(i + "");
    			// 将Tab按钮添加进Tab选项卡中
    			mTabHost.addTab(tabSpec, fragments[i], null);
    		}
    
    		mTabRg = (RadioGroup) findViewById(R.id.tab_rg_menu);
    		mTabRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
    			@Override
    			public void onCheckedChanged(RadioGroup group, int checkedId) {
    				switch (checkedId) {
    				case R.id.tab_rb_1:
    					mTabHost.setCurrentTab(0);
    					break;
    				case R.id.tab_rb_2:
    					mTabHost.setCurrentTab(1);
    
    					break;
    				case R.id.tab_rb_3:
    
    					mTabHost.setCurrentTab(2);
    					break;
    				case R.id.tab_rb_4:
    
    					mTabHost.setCurrentTab(3);
    					break;
    
    				default:
    					break;
    				}
    			}
    		});
    
    		mTabHost.setCurrentTab(0);
    	}
    	
    	
    	/**
    	 * 退出确认
    	 * **/
    	public boolean onKeyDown(int keyCoder, KeyEvent event) {
    		// if (keyCoder == KeyEvent.KEYCODE_BACK) {
    		//
    		// /* 2秒内点击两次返回退出程序 */
    		// if ((System.currentTimeMillis() - exitTime) > 2000) {
    		// Toast.makeText(getApplicationContext(), "再按一次退出程序",
    		// Toast.LENGTH_SHORT).show();
    		// exitTime = System.currentTimeMillis();
    		// } else {
    		// finish();
    		// System.exit(0);
    		// }
    		//
    		// }
    		if (keyCoder == KeyEvent.KEYCODE_BACK) {
    			int x = getFragmentManager().getBackStackEntryCount();
    			if (x == 0) {
    				AlertDialog.Builder builder = new AlertDialog.Builder(this);
    				builder.setMessage("你确定退出吗?")
    						.setCancelable(false)
    						.setPositiveButton("确定",
    								new DialogInterface.OnClickListener() {
    									public void onClick(DialogInterface dialog,
    											int id) {
    										//finish();
    										//System.exit(0);
    										/*
    										 * 回到桌面
    										 * */
    										Intent home = new Intent(Intent.ACTION_MAIN);  
    
    										home.addCategory(Intent.CATEGORY_HOME);   
    
    										startActivity(home); 
    									}
    								})
    						.setNegativeButton("返回",
    								new DialogInterface.OnClickListener() {
    									public void onClick(DialogInterface dialog,
    											int id) {
    										dialog.cancel();
    									}
    								});
    				AlertDialog alert = builder.create();
    				alert.show();
    				return true;
    			}
    			if (x == 1) {
    				Toast.makeText(this, "x==1", Toast.LENGTH_SHORT).show();
    
    			}
    
    		}
    		return false;
    
    	}
    
    
    	@Override
    	public void backEvent() {
    		// TODO Auto-generated method stub
    		
    	}
    	
    	@Override
    	protected void onResume() {
    		Config.isForeground = true;
    		super.onResume();
    		JPushInterface.onResume(this);
    	}
    
    
    	@Override
    	protected void onPause() {
    		Config.isForeground = false;
    		super.onPause();
    		JPushInterface.onPause(this);
    	}
    }
    

      

    package com.wlwl.yiyuan;


    import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.UUID;
    import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;
    import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.DownloadManager;import android.app.FragmentManager;import android.app.ProgressDialog;import android.content.ContentValues;import android.content.DialogInterface;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTabHost;import android.support.v4.app.FragmentTransaction;import android.util.Log;import android.view.KeyEvent;import android.view.Window;import android.widget.RadioGroup;import android.widget.Toast;



    import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TabHost.TabSpec;import cn.jpush.android.api.JPushInterface;
    import com.wlwl.common.Config;import com.wlwl.common.FragmentHelp.OnBackListener;import com.wlwl.dal.D_News;import com.wlwl.enums.M_News;import com.wlwl.fragment.*;import com.wlwl.tools.ConvertX;import com.wlwl.tools.FileX;import com.wlwl.tools.URLX;import com.wlwl.tools.UtilX;


    @SuppressLint("NewApi")public class Index extends FragmentActivity implements OnBackListener { public static FragmentManager fm;String newVerName = "";//新版本名称 int newVerCode = -1;//新版本号 String newURL = "";//新版本下载地址  ProgressDialog pd = null;private static final String UPDATE_SERVERAPK = null;// 定义FragmentTabHost对象private FragmentTabHost mTabHost;private RadioGroup mTabRg;
    private final Class[] fragments = { index.class, division.class, users.class,setting.class };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 去掉标题栏    requestWindowFeature(Window.FEATURE_NO_TITLE);    setContentView(R.layout.index);initView();boolean isNetWork = UtilX.isNetworkConnected(getApplicationContext());if (isNetWork == true) {upadte();}}public void upadte() {getServerVer();} /**     * 不更新版本     */    public void notNewVersionUpdate(){        int verCode = UtilX.getVerCode(this);        String verName = UtilX.getVerName(this);        StringBuffer sb = new StringBuffer();        sb.append("当前版本:");        sb.append(verName);        sb.append(" Code:");        sb.append(verCode);        sb.append(" 已是最新版本,无需更新");        Dialog dialog = new AlertDialog.Builder(this)        .setTitle("软件更新")        .setMessage(sb.toString())        .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub                finish();            }        }).create();        dialog.show();    }
    /** * 从服务器端获得版本号与版本名称 *  * @return */public boolean getServerVer() {try {
    try {new Thread(new Runnable() {public void run() {String url1 = Config.Url_UpdateApp; // 更新app地址String aaa = URLX.GetUrl(url1); // 请求结果mHandler.obtainMessage(2, aaa).sendToTarget();
    }}).start();
    } catch (Exception e) {// TODO: handle exception}
    } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}return true;}
    /** * 操作UI * */private Handler mHandler = new Handler() {public void handleMessage(Message msg) {// 此方法在ui线程运行switch (msg.what) {case 2: // 更新APPString s  = msg.obj.toString();if (ConvertX.IsNull(s) == false) {
    try {JSONObject jsonObject2 = new JSONObject(s);String state = jsonObject2.getString("state");int rr = ConvertX.ToInt(state);if (rr == 200) {JSONArray jsonArray = new JSONObject(s).getJSONArray("model");for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObjectSon = (JSONObject) jsonArray.opt(i);String ver = jsonObjectSon.getString("ver");String url= jsonObjectSon.getString("url");String name = jsonObjectSon.getString("name");newVerCode = ConvertX.ToInt( ver);newVerName = name;    newURL =   url;   // FileX.Write_Log(newURL);                int verCode = UtilX.getVerCode(Index.this); // 系统版本    Log.i("download_url",newURL);    Log.i("download_name",name);    Log.i("系统版本",verCode+"");    Log.i("服务器版本",newVerCode+"");    if (newVerCode > verCode) { doNewVersionUpdate();//更新版本} else {}}}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {}
    break;}}};

    private void DownLoadApp(String Url, String Name) {
    try {DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    DownloadManager.Request down = new DownloadManager.Request(Uri.parse(Url));
    // 设置允许使用的网络类型,这里是移动网络和wifi都可以down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE| DownloadManager.Request.NETWORK_WIFI);// 是否显示在通知栏down.setShowRunningNotification(true);// 是否显示下载界面down.setVisibleInDownloadsUi(true);// 设置下载后文件存放的位置 down.setDestinationInExternalFilesDir(getApplication(), null, Name);
    // 表示允许MediaScanner扫描到这个文件,默认不允许。//down.allowScanningByMediaScanner();
    down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);down.setMimeType("application/vnd.android.package-archive");// 设置为可被媒体扫描器找到down.allowScanningByMediaScanner();// 设置为可见和可管理down.setVisibleInDownloadsUi(true);// 获取此次下载的ID
    // 注册广播接收器,当下载完成时自动安装IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
    down.setDestinationInExternalPublicDir("download", Name);// 将下载请求放入队列long reference = manager.enqueue(down);
    Log.i("下载ID", reference + "");
    } catch (Exception e) {Log.i("DownLoadApp(String Url , String Name)", e.getMessage());}
    } /**    * 更新版本    */   public void doNewVersionUpdate(){       int verCode = UtilX.getVerCode(this);       String verName = UtilX.getVerName(this);       StringBuffer sb = new StringBuffer();       sb.append("发现新版本");                 sb.append(",是否更新");                     AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage(sb.toString()).setCancelable(false).setPositiveButton("更新",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int id) { pd = new ProgressDialog(Index.this);                pd.setTitle("正在下载");                pd.setMessage("请稍后。。。");                pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);                                                Toast.makeText(getApplication(), "正在下载请稍后.....",Toast.LENGTH_LONG).show();                DownLoadApp(newURL,newVerName);               // downLoadFile(newURL);}}).setNegativeButton("暂不更新",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int id) {dialog.cancel();}});AlertDialog alert = builder.create();alert.show();                        }       
       // 初始化Fragment(FragmentActivity中呼叫)   public static void initFragment(android.app.Fragment f){       changeFragment(f, true);   }   private static void changeFragment(android.app.Fragment f, boolean init){       android.app.FragmentTransaction ft =  fm.beginTransaction();       ft.replace(R.id.realtabcontent, f);       if(!init)           ft.addToBackStack(null);       ft.commit();   }         private void initView() {mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);// 得到fragment的个数int count = fragments.length;for (int i = 0; i < count; i++) {// 为每一个Tab按钮设置图标、文字和内容TabSpec tabSpec = mTabHost.newTabSpec(i + "").setIndicator(i + "");// 将Tab按钮添加进Tab选项卡中mTabHost.addTab(tabSpec, fragments[i], null);}
    mTabRg = (RadioGroup) findViewById(R.id.tab_rg_menu);mTabRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {case R.id.tab_rb_1:mTabHost.setCurrentTab(0);break;case R.id.tab_rb_2:mTabHost.setCurrentTab(1);
    break;case R.id.tab_rb_3:
    mTabHost.setCurrentTab(2);break;case R.id.tab_rb_4:
    mTabHost.setCurrentTab(3);break;
    default:break;}}});
    mTabHost.setCurrentTab(0);}/** * 退出确认 * **/public boolean onKeyDown(int keyCoder, KeyEvent event) {// if (keyCoder == KeyEvent.KEYCODE_BACK) {//// /* 2秒内点击两次返回退出程序 */// if ((System.currentTimeMillis() - exitTime) > 2000) {// Toast.makeText(getApplicationContext(), "再按一次退出程序",// Toast.LENGTH_SHORT).show();// exitTime = System.currentTimeMillis();// } else {// finish();// System.exit(0);// }//// }if (keyCoder == KeyEvent.KEYCODE_BACK) {int x = getFragmentManager().getBackStackEntryCount();if (x == 0) {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage("你确定退出吗?").setCancelable(false).setPositiveButton("确定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int id) {//finish();//System.exit(0);/* * 回到桌面 * */Intent home = new Intent(Intent.ACTION_MAIN);  
    home.addCategory(Intent.CATEGORY_HOME);   
    startActivity(home); }}).setNegativeButton("返回",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int id) {dialog.cancel();}});AlertDialog alert = builder.create();alert.show();return true;}if (x == 1) {Toast.makeText(this, "x==1", Toast.LENGTH_SHORT).show();
    }
    }return false;
    }

    @Overridepublic void backEvent() {// TODO Auto-generated method stub}@Overrideprotected void onResume() {Config.isForeground = true;super.onResume();JPushInterface.onResume(this);}

    @Overrideprotected void onPause() {Config.isForeground = false;super.onPause();JPushInterface.onPause(this);}}

  • 相关阅读:
    MySQL模糊匹配查询like、regexp、in
    MySQL数据库——表操作
    (转)MySQL join语法解析与性能分析
    (转)解决 TortoiseGit 诡异的 Bad file number 问题
    四、windows下TortoiseGit的使用与操作
    (转)创建GitHub技术博客
    二、Windows下TortoiseGit的安装与配置
    三、TortoiseGit之配置密钥
    集训之6-26模拟赛一
    集训之各种dp
  • 原文地址:https://www.cnblogs.com/ainidewen/p/6295648.html
Copyright © 2011-2022 走看看