0

I was doing a simple application that can register users and post like articles made by users. As the code of the class that register the user works perfectly, the post one doesn't work.

With the post class I can save the title and the description of the post into the database, but no error and nothing is displayed in the database.

Here is my posts code (CrudPost.java):

package com.example.newsapp4;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.newsapp4.Connection.ConnectionClass;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class CrudPost extends AppCompatActivity {

    EditText etTitle, etDesc;
    Button btnPost, btnBack;

    //Conexion con SQL Server
    Connection con;
    Statement stmt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crud_post);

        etTitle = findViewById(R.id.etTituloPost);
        etDesc = findViewById(R.id.etDescPost);
        btnPost = findViewById(R.id.btnPostear);
        btnBack = findViewById(R.id.btnAtras);

        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

        btnPost.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new CrudPost.makePost().execute("");
            }
        });
    }

    public class makePost extends AsyncTask<String, String, String>{
        String z = "";
        Boolean isSuccess = false;

        @Override
        protected void onPreExecute() {
            Toast.makeText(CrudPost.this, "Sending post to database", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onPostExecute(String s) {
            Toast.makeText(CrudPost.this, "Data sent!", Toast.LENGTH_SHORT).show();
            etTitle.setText("");
            etDesc.setText("");
        }

        @Override
        protected String doInBackground(String... strings) {
            try {
                con = connectionClass(ConnectionClass.ip.toString(), ConnectionClass.port.toString(),ConnectionClass.db.toString(),ConnectionClass.un.toString(),ConnectionClass.pass.toString());
                if(con == null){
                    z = "Check your Internet Connection";
                }else{
                    //Inserta lo que escribimos en los campos del usuario, contraseña y email.
                    String sql = "INSERT INTO articles (Title, Descri) VALUES ('"+ etTitle.getText()+"', '"+etDesc.getText()+"')";
                    stmt = con.createStatement();
                    stmt.executeUpdate(sql);
                }
            }catch(Exception e){
                isSuccess = false;
                z = e.getMessage();
            }
            return z;
        }
    }

    //Conexion a la base de datos de SQL Server
    @SuppressLint("NewApi")
    public Connection connectionClass(String server, String port, String database, String username, String pass){
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection connection = null;
        String connectionURL = null;
        try{
            //Obtencion del driver jtds para la conexion con la base de datos
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            connectionURL= "jdbc:jtds:sqlserver://"+ server + ":" +port+ ";"+ "databaseName="+ database +";user="+username+";password="+pass+";";
            connection = DriverManager.getConnection(connectionURL);
            System.out.println(connectionURL);
        }catch (Exception e){
            Log.e("SQL Connection Error : ", e.getMessage());
            System.out.println(connectionURL);
        }

        return connection;

    }

}

And I'm using a connectionClass.java that has got the attributes that connects to the database:

package com.example.newsapp4.Connection;

public class ConnectionClass {
    public static String ip = "My IP";
    public static String un = "My username";
    public static String pass = "My password";
    public static String db = "My database";
    public static String port = "My port";
}

As I said, in the register class that is the MainActivity.java class everthing works perfectly: This is my MainActivity.java class:

package com.example.newsapp4;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

import com.example.newsapp4.Connection.ConnectionClass;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.Task;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;


public class MainActivity extends AppCompatActivity {

    Button botonInicio, botonRegistro;
    VideoView videoBack;
    EditText pass, email, username;
    Intent intencion;

    //Conexion con SQL Server
    Connection con;
    Statement stmt;

    //TextView
    TextView status;

    //Google SignIn Button
    int RC_SIGN_IN = 0;
    SignInButton signInButton;
    GoogleSignInClient mGoogleSignInClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoBack = (VideoView) findViewById(R.id.vvBack);

        //btnRegistro
        botonRegistro = (Button) findViewById(R.id.btn_registro);

        //TextView
        status = (TextView) findViewById(R.id.tvRegister);

        //editText
        email = (EditText) findViewById(R.id.etEmail);
        pass = (EditText) findViewById(R.id.etPass);
        username = (EditText) findViewById(R.id.etUsername);

        //Google
        signInButton = findViewById(R.id.googleSignInBtn);

        //El boton de Google, una vez checkeado que es un inicio de sesion correcto, ejecutrá el metodo signIn()
        //el cual
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();
        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        signInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                signIn();
            }
        });


        botonRegistro.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    new MainActivity.registerUser().execute("");
            }
        });

        botonInicio = (Button) findViewById(R.id.btn_inicioSesion);

        String path ="android.resource://com.example.newsapp4/"+R.raw.mix;
        Uri u = Uri.parse(path);
        videoBack.setVideoURI(u);
        videoBack.start();

        videoBack.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setLooping(true);
            }
        });
        //Intent that redirects the user to the login activity
        botonInicio.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intencion = new Intent(MainActivity.this, LoginActivity.class);
                startActivity(intencion);
                finish();
            }
        });
    }

    //Google Register (dont affect the SQL Server connection)
    private void signIn(){
        Intent signInIntencion = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntencion, RC_SIGN_IN);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        GoogleSignInClient getSignInIntent
        if (requestCode == RC_SIGN_IN){
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try{
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            startActivity(new Intent(MainActivity.this, menuContent.class));
        }catch(ApiException e){
            Log.w("Google Sign In Error", "SignInResult: failed code=" + e.getStackTrace());
            Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show();
        }
    }

    protected void onStart(){
        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null){
            startActivity(new Intent(MainActivity.this, menuContent.class));
        }
        super.onStart();
    }


//Here stars the SQL Server connection to the database code

    //Store the posts that the user writes in the app
    public class registerUser extends AsyncTask<String, String, String>{
        String z = "";
        Boolean isSuccess = false;

        @Override
        protected void onPreExecute() {
            status.setText("Sending data to Database");
        }

        @Override
        protected void onPostExecute(String s) {
            status.setText("Registration Succesfull");
            username.setText("");
            email.setText("");
            pass.setText("");
        }

        @Override
        protected String doInBackground(String... strings) {
            try {
                con = connectionClass(ConnectionClass.ip.toString(), ConnectionClass.port.toString(),ConnectionClass.db.toString(),ConnectionClass.un.toString(),ConnectionClass.pass.toString());
                if(con == null){
                    z = "Check your Internet Connection";
                }else{
                    //Insert all the data into the database.
                    String sql = "INSERT INTO users (Username, Pass, Email) VALUES ('"+ username.getText()+"', '"+pass.getText()+"','"+email.getText()+"')";
                    stmt = con.createStatement();
                    stmt.executeUpdate(sql);
                }
            }catch(Exception e){
                    isSuccess = false;
                    z = e.getMessage();
            }
            return z;
        }
    }

    //SQL Server connection to the database
    @SuppressLint("NewApi")
    public Connection connectionClass(String server, String port, String database, String username, String pass){
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection connection = null;
        String connectionURL = null;
        try{
            //Obtencion del driver jtds para la conexion con la base de datos
                Class.forName("net.sourceforge.jtds.jdbc.Driver");
                connectionURL= "jdbc:jtds:sqlserver://"+ server + ":" +port+ ";"+ "databaseName="+ database +";user="+username+";password="+pass+";";
                connection = DriverManager.getConnection(connectionURL);
                System.out.println(connectionURL);
        }catch (Exception e){
            Log.e("SQL Connection Error : ", e.getMessage());
            System.out.println(connectionURL);
        }

        return connection;

    }



    //Metodos para que el video en el fondo funcione.
    protected void onResume(){
        videoBack.resume();
        super.onResume();
    }
    protected void onPause(){
        videoBack.suspend();
        super.onPause();
    }
    protected void onDestroy(){
        videoBack.stopPlayback();
        super.onDestroy();
    }
}

There are some methods that do other things like onResume(), onPause() and onDestroy() or the Google Register methods that don't affect the SQL Server connection.

And here is the interesting part of the code, it displays no error!, but nothing is saved in the database.

At this point I don't know what should I do.

Thanks for your time!

  • FYI:[JDBC vs Web Service for Android](https://stackoverflow.com/q/15853367/295004) – Morrison Chang May 27 '21 at 13:17
  • stop commenting the same link in both of my problems, this doesnt solve any of them, its only a recomendation and completely useless, dont make me report you please... – Sergio Campos Lacueva May 27 '21 at 19:51
  • 1
    Apologies, I didn't realize this is a continuation. If you have control over the SQL Server, you may want to check what connection logs are generated. A big problem is database connection timeout. If you restart the SQL server / increase the number of client connections and all of sudden it works, that would lead toward that issue. – Morrison Chang May 27 '21 at 20:12
  • Apologies accepted! and yeah, I will definetly try that out. Thanks for the advice! :) – Sergio Campos Lacueva May 27 '21 at 21:55

0 Answers0