2017-02-07 6 views
0

Я выполняю некоторые задания, и мне нужно включить синхронизацию данных SQLite DB с MySQL DB на сервере localhost. При нажатии кнопки данные из SQLite должны быть «собраны», преобразованы в JSON и отправлены в локальный MySQL DB и вставлены туда. Я сделал Activity, который обрабатывает эту работу, сделал некоторый PHP в соответствии с примером академии и запустил сервер wamp, где я создал базу данных, в которой должны храниться данные. В моей базе данных localhost называется employeees_db, а таблица внутри называется Employes. Вот код из Android Studio, который я сделал:Android - отправка данных из Android SQLite DB в MySQL DB на сервере localhost

package com.EmDatabase; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class DataSyncManager extends Activity { 

Database db; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sync_options); 
    db = new Database(this); 
    db.getWritableDatabase(); 
} 

public void syncToServer(View v) throws JSONException { 
    List<Employe> employes = db.selectAll(); 
    JSONObject objEmployes = new JSONObject(); 
    JSONArray employesData = new JSONArray(); 
    for (Employe employe : employes) { 
     int id = employe.getId(); 
     String name = employe.getName(); 
     String surname = employe.getSurname(); 
     int age = employe.getAge(); 
     String company = employe.getCompany(); 
     String wtype = employe.getWorktype(); 
     JSONObject empData = new JSONObject(); 
     empData.put("id", id); 
     empData.put("name", name); 
     empData.put("surname", surname); 
     empData.put("age", age); 
     empData.put("company", company); 
     empData.put("worktype", wtype); 
     employesData.put(empData); 
    } 
    objEmployes.put("all_employes", employesData); 
    String result = objEmployes.toString(); 
    System.out.println(result); 
    UploadJsonStringTask task = new UploadJsonStringTask(); 
    task.execute(
      new String[] { "http://10.0.2.2/employes_db/register.php", result} 
    ); 
} 

public void syncFromServer(View v) { 

} 

private class UploadJsonStringTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String response = ""; 
     Map<String,String> queries = new HashMap<String, String>(1); 
     queries.put("all_employes", params[1]); 
     try { 
      response += postHttpContent(params[0],queries); 
     } catch (IOException e) { 
      Log.e("error", e.toString()); 
     } 
     return response; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
    } 

    public String postHttpContent(String urlString, Map<String, String> queries) throws IOException { 
     String response = ""; 
     URL url = new URL(urlString); 
     HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); 
     httpConnection.setDoInput(true); 
     httpConnection.setDoOutput(true); 
     httpConnection.setUseCaches(false); 
     httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

     String postData = ""; 
     for (String key : queries.keySet()) { 
      postData += "&" + key + "=" + queries.get(key); 
     } 
     postData = postData.substring(1); 
     DataOutputStream postOut = new DataOutputStream(httpConnection.getOutputStream()); 
     postOut.writeBytes(postData); 
     postOut.flush(); 
     postOut.close(); 

     int responseCode = httpConnection.getResponseCode(); 
     if (responseCode == HttpURLConnection.HTTP_OK) { 
      String line; 
      BufferedReader br = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); 
      while ((line = br.readLine()) != null) { 
       response += line; 
      } 
     } else { 
      response = ""; 
      throw new IOException(); 
     } 
     return response + " *** Uploaded!"; 
    } 
} 

public void goBack(View v) { 
    Intent in= new Intent(DataSyncManager.this,MainActivity.class); 
    startActivity(in); 
} 

}

А вот PHP файл я сделал и вставил в WampServer/WWW/employes_db (register.php):

<?php 
$id = 0; 
$name = ""; 
$surname = ""; 
$age = 0; 
$company = ""; 
$worktype = ""; 
$conn = new mysqli("localhost","root","","employes_db"); 
$conn->query("insert into employes values (null,'".$_POST['id']."','".$_POST['name']."','".$_POST['surname']."','".$_POST['age']."','".$_POST['company']."','".$_POST['worktype']."')"); 
if(!$conn->error) echo "{status:0}"; else echo "{status:-1}"; 
?> 

Когда я запускаю приложение, вставьте одну строку в базу данных SQLite, а не нажмите кнопку синхронизации, и я открою «localhost/employes_db/register.php». Я получаю «ошибки» -> Примечание: неопределенный индекс: id в C: \ wamp64 \ www \ employes_db \ ​​register.php в строке 9 < - И такая же ошибка для отдыха столбцов (имя, фамилия, возраст, компания, wtype). Может кто-нибудь помочь, где моя ошибка?

ответ

1

Undefined index: id средства $_POST['id'] не существует. Первая ошибка заключается в том, что вы используете $_POST для извлечения данных, вместо этого используйте $_GET. Во-вторых, чтобы получить данные с помощью $_GET, вы должны получить доступ к своим URL-адресам следующим образом: localhost/register.php?id=myID.


В вашем случае, если вы отправляете данные через HttpPost так просто использовать file_get_contents('php://input'), чтобы получить строку JSON, декодирует данные в формате JSON (json_decode($myJSONString)) вы получаете и отправить его на второй базе данных.

EDIT
Если я правильно понял вашу проблему, то вы могли бы сделать это следующим образом:

// get all employees from your first database and write them into a JSONArray 

List<Employe> employes = db.selectAll(); 
JSONObject objEmployes = new JSONObject(); 
JSONArray employesData = new JSONArray(); 
for (Employe employe : employes) { 
    int id = employe.getId(); 
    String name = employe.getName(); 
    String surname = employe.getSurname(); 
    int age = employe.getAge(); 
    String company = employe.getCompany(); 
    String wtype = employe.getWorktype(); 
    JSONObject empData = new JSONObject(); 
    empData.put("id", id); 
    empData.put("name", name); 
    empData.put("surname", surname); 
    empData.put("age", age); 
    empData.put("company", company); 
    empData.put("worktype", wtype); 
    employesData.put(empData); 
} 

// open connection 
URL url = new URL("yourUrl.com/yourPhpScript.php"); 
url.openConnection(); 

// send JSONArray to your second database 
String dataToSend = employesData.toString(); 
OutputStream os = urlConnection.getOutputStream(); 
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
writer.write(dataToSend); 
writer.flush(); 
writer.close(); 

PHP скрипт:

<?php 
// connect to database 
$link = mysqli_connect($hostname, $username, $password); 
mysqli_select_db($link, "myDatabase"); 

// get the JSONArray the app sends 
$contents = file_get_contents('php://input'); 

$jsonArray = json_decode($contents, true); 
$jsonCount = count($jsonArray); 

for ($i = 0; $i < $jsonCount; $i++) { 
    $item = $jsonArray[$i]; 
    $itemName = utf8_decode($item['name']); 
    // parse the other json attributes here like the one above 

    $query = "INSERT INTO employees VALUES('$itemName', 'addOtherValuesHere...')"; 
    mysqli_query($link, $query); 
} 
+0

мне нужно использовать POST Insted из GET, потому что я переношу данные из своей базы данных, поэтому я не буду отправка одной, двух или трех данных, но гораздо больше, и это зависит от количества данных, которые я вставляю в базу данных, прежде чем я нажму кнопку синхронизации. Можете ли вы объяснить, как установить file_get_contents ... в моем случае, и где, cauze, я плохо разбираюсь в PHP, я написал только этот код для своего задания, используя пример, который я нашел в своей Академии. – Mystiq

+1

@Mystiq Я добавил пример кода, вот как бы я решил вашу проблему, надеюсь, что это поможет вам, и я правильно понял вас. – Tyrmos

+0

Я использовал ваш PHP-скрипт, но сохранил свой код из приложения, потому что когда я добавляю url.openConnection(); он становится красным, как никакой метод ... Я сделал еще один шаг, но теперь я получаю еще одно «предупреждение» ... Вот он: Примечание: неопределенная переменная: localhost в C: \ wamp64 \ www \ employes_db \ ​​register .php в строке 3 То же самое для root и для пароля ... и эти предупреждения: Предупреждение: mysqli_connect(): (HY000/1045): Доступ запрещен для пользователя '' 'localhost' '(с использованием пароля: NO) в C: \ wamp64 \ www \ employes_db \ ​​register.php в строке 3 У вас есть идеи по этому вопросу? – Mystiq