Я новичок в Android и занимаюсь разработкой приложения, которое извлекает данные с локального (временного) сервера SQL, используя PHP-скрипт для получения нужной таблицы и извлечения полей. Теперь все это хорошо, следуя инструкциям, так что у меня есть ReyclerView
с CustomAdapter
и использую LoaderManager
так что у меня есть загрузчик, который выполняет метод fetchData в моем Utils Class
внутри этого класса есть методы, используемые для HttpUrlConnection
до извлечения данных JSON из моей базы данных SQL и из List<>
моей модели (Dish.Java), которая содержит методы проводника и геттера.
Но теперь я пытаюсь вместо этого отправить данные в другую таблицу, например, для элементов, которым нравится или оценивают для каждого элемента для этой цели. Я создал новую таблицу, которая просто содержит значения в виде INT (позже прикрепить к элементам с внешним ключом), соответственно я сделал поиск и нашел PHP-скрипт (который подходит для моего идиота в случае извлечения данных) следующим образом:
<?php
if($_SERVER["REQUEST_METHOD"]=="POST"){
require 'connection.php';
updateLikes();
}
function updateLikes(){
global $connect;
$likes = $_POST['likes'];
$query = "UPDATE likes SET likes = '$likes'";
mysqli_query($connect,$query) or die (mysqli_error($connect));
mysqli_close($connect);
}
?>
Если я пытаюсь сделать POST
Просьба не ставить на например Postman
Я могу изменить поле лайков в моей таблице. но не знаю, как я собираюсь добавить это к моему запросу
так что, например, принимая значение Ratingbar
после оценки и накапливать его на сервере в поле лайков (я знаю, это смешно).
что я нашел, что я могу сделать setRequestMethod
для HttpUrlConnection
«POST» и использовать DataOutputStream
как это:
class UpdateLikes extends AsyncTask<String, Void, Void> {
String URL = "http://localhost:81/likes.php";
@Override
protected Void doInBackground(String... params) {
String jsonData = params[0];
String charset = "UTF-8";
try {
java.net.URL url = new URL(URL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Accept-Charset", charset);
httpURLConnection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.connect();
//send data
DataOutputStream os = new DataOutputStream(httpURLConnection.getOutputStream());
os.writeBytes(jsonData.toString());
//OutputStream dos = httpURLConnection.getOutputStream();
//dos.write(Integer.parseInt(jsonData.toString()));
//receive & read data response
InputStream is = httpURLConnection.getInputStream();
StringBuilder result = new StringBuilder();
int byteCharacter;
while ((byteCharacter = is.read()) != -1) {
result.append((char) byteCharacter);
}
Log.d("json api", "DoUpdateProduct.doInBackground Json return: " + result);
os.flush();
is.close();
os.close();
httpURLConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Это мой код в слушателе рейтинга для выполнения AsyncTask doInBackground
String counter = String.valueOf(rating);
Like likes = new Like(counter);
try {
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
jsonObject.put("likes",likes.likes);
jsonArray.put(jsonObject);
Log.d("json api", "Json array converted from Product: " + jsonArray.toString());
String jsonData = String.valueOf(jsonArray);
new UpdateLikes().execute(jsonData);
} catch (JSONException e) {
e.printStackTrace();
}
Log.e(MondayActivity.LOG_TAG, "Rating is:" + rating);
}
});
и затем выполнить то, что когда я отладил, я могу получить рейтинг и установить его в массив, установить соединение все, но это ничего не обновляет в моей базе данных.
поэтому любая Рекомендация о том, как я могу достичь этого или, может быть, есть совершенно другой способ, даже пересмотреть, будет принята с благодарностью.
вот мои уроки, так что вы посмотрите, что происходит
QuerUtils.Java
public class QueryUtils {
public static long date;
public static ArrayList<String> ls;
public QueryUtils() {
}
private static URL createUrl(String strUrl) {
URL url = null;
try {
url = new URL(strUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
Log.e(LOG_TAG, "Problem building the URL ", e);
}
return url;
}
private static String makeHttpRequest(URL url) throws IOException {
String jsonResponse = "";
//TODO new
if (url == null) {
return jsonResponse;
}
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(10000);
urlConnection.setConnectTimeout(15000);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
inputStream = urlConnection.getInputStream();
jsonResponse = readFromStream(inputStream);
} catch (IOException e) {
Log.e(LOG_TAG, "Problem retrieving the JSON results.", e);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (inputStream != null) {
inputStream.close();
}
}
return jsonResponse;
}
private static String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = bufferedReader.readLine();
while (line != null) {
output.append(line);
line = bufferedReader.readLine();
}
}
return output.toString();
}
public static List<Dish> fetchData(String requestUrl) {
/* try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
*/
URL url = createUrl(requestUrl);
String jsonResponse = "";
try {
jsonResponse = makeHttpRequest(url);
} catch (IOException e) {
Log.e(LOG_TAG, "Problem making the HTTP request.", e);
}
List<Dish> dishes = extractFeatureFromJson(jsonResponse);
Log.i(LOG_TAG, "QueryUtils returns " + dishes);
return dishes;
}
private static List<Dish> extractFeatureFromJson(String jsonResponse) {
if (TextUtils.isEmpty(jsonResponse)) {
return null;
}
List<Dish> dishes = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(jsonResponse);
JSONArray jsonArray = jsonObject.getJSONArray("data");
JSONObject jsonObject1 = null;
//dishes = new ArrayList<>();
ls = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject1 = (JSONObject) jsonArray.get(i);
if (jsonObject1 != null) {
String name = jsonObject1.getString("dish");
String daytime = jsonObject1.getString("daytime");
String dishName = jsonObject1.getString("dish");
String component = jsonObject1.getString("component");
double price = jsonObject1.getDouble("price");
String day = jsonObject1.getString("weakday");
int iconId_1 = jsonObject1.getInt("iconid_1");
int iconId_2 = jsonObject1.getInt("iconid_2");
date = jsonObject1.getLong("date");
int likesCounter = jsonObject1.getInt("likes");
String likes = String.valueOf((int) likesCounter);
Log.e(LOG_TAG, String.valueOf(date));
ls.add(jsonObject1.getString("date"));
Dish dish = new Dish(name, daytime, dishName,
component, price, day, date, iconId_1, iconId_2, likes);
dishes.add(dish);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return dishes;
}
}
DishAdapterTest.java
public class DishAdapterTest extends RecyclerView.Adapter<DishAdapterTest.ViewHolder> {
private List<Dish> dishes;
private Context context;
public DishAdapterTest(Context context, List<Dish> dishes) {
this.context = context;
this.dishes = dishes;
}
@NonNull
@Override
public DishAdapterTest.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.list_item_dish, parent, false);
return new ViewHolder(itemView);
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Dish dish = dishes.get(position);
holder.daytimeTextView.setText(dish.getmDayTime());
holder.dishTextView.setText(dish.getmDish());
holder.componentTextView.setText(dish.getmComponent());
double originalPrice = dish.getmPrice();
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.GERMANY);
String price = format.format(originalPrice);
//String format2 = new DecimalFormat("#,###.00").format(dish.getmPrice());
holder.priceTextView.setText(price);
int icon_id = getIcon(dish.getmImageResId1());
holder.iconImageView.setImageResource(icon_id);
int icon_id2 = getIcon(dish.getmImageResId2());
holder.icon1ImageView.setImageResource(icon_id2);
holder.likesTextView.setText(dish.getmLikes());
holder.mRatingbar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
Log.e(MondayActivity.LOG_TAG, "Rating is:" + rating);
}
});
}
public void setData(List<Dish> data) {
dishes.clear();
dishes.addAll(data);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
Log.i("DishAdapter Mensa ", "dishes.size() = " + dishes.size());
return dishes.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
// The ViewHolder design pattern
private TextView daytimeTextView;
private TextView dishTextView;
private TextView componentTextView;
private TextView priceTextView;
private ImageView iconImageView;
private ImageView icon1ImageView;
private RatingBar mRatingbar;
private TextView likesTextView;
public ViewHolder(View view) {
super(view);
this.daytimeTextView = view.findViewById(R.id.daytime_text_view);
this.dishTextView = view.findViewById(R.id.dish_text_view);
this.componentTextView = view.findViewById(R.id.component_text_view);
this.priceTextView = view.findViewById(R.id.price_text_view);
this.iconImageView = view.findViewById(R.id.icon_image_view);
this.icon1ImageView = view.findViewById(R.id.icon_image_view1);
this.mRatingbar = view.findViewById(R.id.ratingBar);
this.likesTextView = view.findViewById(R.id.likes_counter_text_view);
}
}
}
Просто в основной деятельности, связанной с этим у меня есть мой адаптер
у меня есть переопределенный метод Loader
@Override
public Loader<List<Dish>> onCreateLoader(int i, Bundle bundle) {
Log.e(LOG_TAG, "Initializing OnCreate Loader");
if (dishList1.size() > 0) {
dishList1.clear();
dishAdapter.notifyDataSetChanged();
}
return new DishLoader(this, REQUEST_URL);
}
@Override
public void onLoadFinished(Loader<List<Dish>> loader, List<Dish> dishes) {
Log.e(LOG_TAG, "Initializing onFinished");
View loadingIndicator = findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
dishList1.clear();
Log.e(LOG_TAG, "Initializing onFinished Clear Adapter");
if (dishes != null && !dishes.isEmpty()) {
dishList1.clear();
dishList1 = dishes;
dishAdapter.setData(dishes);
}
}
Пожалуйста, проверьте запрос на обновление в вашем PHP-скрипте.
$query = "UPDATE tableName SET columnName = 'values', columnName = 'values' WHERE columnName = 'values';
$query = "UPDATE likes SET likes = '$likes'";
Вы забыли WHERE
пункт.
Других решений пока нет …