данные не зарегистрированы в базе данных sqlite - PullRequest
0 голосов
/ 10 апреля 2019

я не знаю почему, но мои вставки из CreationCompte.java больше не регистрируются в моей базе данных sqlite, у меня нет сообщения об ошибке, и моя функция insertUser вызывается в моем файле logcat, я не понимаю, что происходит, я новичок в Android, кто-то может помочь мне найти проблему, пожалуйста?

ps: мои XML-файлы, кажется, все ясно.

MainActivity.java:

package com.example.tp1;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private EditText Login;
    private EditText password;
    private Button submit;
    private int counter = 5;
    private TextView Info;
    private Button inscription;

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

        Login = (EditText)findViewById(R.id.Login);
        password = (EditText)findViewById(R.id.password);
        submit = (Button) findViewById(R.id.submit);
        inscription = (Button) findViewById(R.id.inscription);
        Info = (TextView) findViewById(R.id.Info);

       Intent intent = getIntent();
        if (intent != null) {
            String login = "";
            String mdp = "";
            if (intent.hasExtra("login") && intent.hasExtra("mdp")) { // vérifie qu'une valeur est associée à la clé “login”
                login = intent.getStringExtra("login"); // on récupère la valeur associée à la clé
                mdp = intent.getStringExtra("mdp");
                Login.setText(login);
                password.setText(mdp);
            }
        }

        Info.setText("No of attempts remaining : 5");

        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                validate(Login.getText().toString(), password.getText().toString());
            }
        });

        inscription.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sinscrire();
            }
        });
    }

    private void validate(String Login, String password) {
        if(Login.equals(getString(R.string.Login)) && password.equals(getString(R.string.password))) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("Login", Login);
            startActivity(intent);
        } else {
            counter--;

            Info.setText("nb of attempts remaining" + String.valueOf(counter));

            if (counter==0) {
                submit.setEnabled(false);
            }
        }
    }

    private void sinscrire() {
        Intent intent = new Intent(MainActivity.this, creationCompte.class);
        startActivity(intent);
    }
}

CreationCompte.java:

package com.example.tp1;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class creationCompte extends AppCompatActivity {

    private EditText nom;
    private EditText prenom;
    private EditText telephone;
    private EditText courriel;
    private EditText login;
    private EditText mdp;
    private EditText confirmationmdp;
    private Button valider;
    private Button annuler;
    private SQLiteDatabaseHelper DataBaseManager;

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

        nom = (EditText)findViewById(R.id.nom);
        prenom = (EditText)findViewById(R.id.prenom);
        telephone = (EditText) findViewById(R.id.telephone);
        courriel = (EditText) findViewById(R.id.courriel);
        login = (EditText)findViewById(R.id.login);
        mdp = (EditText)findViewById(R.id.mdp);
        confirmationmdp = (EditText)findViewById(R.id.confirmationmdp);
        valider = (Button) findViewById(R.id.valider);
        annuler = (Button) findViewById(R.id.annuler);


        valider.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                validation(nom, prenom, telephone, courriel, login, mdp, confirmationmdp);
            }
        });

        annuler.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                annulation();
            }
        });
    }

    private void validation(EditText nom, EditText prenom, EditText telephone, EditText courriel, EditText login, EditText mdp, EditText confirmationmdp ) {
        if (mdp.getText().toString().equals(confirmationmdp.getText().toString())) {
            DataBaseManager = new SQLiteDatabaseHelper(this);
            DataBaseManager.insertUser(nom.getText().toString(), prenom.getText().toString(), telephone.getText().toString(), courriel.getText().toString(), login.getText().toString(), mdp.getText().toString());
            DataBaseManager.close();
            Intent intent = new Intent(creationCompte.this, MainActivity.class);
            intent.putExtra("login", login.getText().toString());
            intent.putExtra("mdp", mdp.getText().toString());
            startActivity(intent);
        } else {
            Toast.makeText(getApplicationContext(),"nous n'avons pas compris votre mot de passe !", Toast.LENGTH_LONG).show();
        }
    }

    private void annulation() {
        Intent intent = new Intent(creationCompte.this, MainActivity.class);
        startActivity(intent);
    }
}

SQLiteDataBaseHelper.java:

package com.example.tp1;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class SQLiteDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "nt3.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "user_table";

    public SQLiteDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String strSql = "create table user_table ("
                + " idUser integer primary key autoincrement,"
                + " nom text not null,"
                + " prenom text not null,"
                + " telephone text not null,"
                + " courriel text not null,"
                + " login text not null,"
                + " mdp text not null"
                + ")";
        db.execSQL(strSql);
        Log.i( "DATABASE", "onCreate invoked" );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String strSql = "drop table user_table";
        db.execSQL(strSql);
        Log.i( "DATABASE", "onUpgrade invoked" );
    }

    public void insertUser(String nom, String prenom, String telephone, String courriel, String login, String password) {
        nom = nom.replace("'", "''");
        prenom = prenom.replace("'", "''");
        telephone = telephone.replace("'", "''");
        courriel = courriel.replace("'", "''");
        login = login.replace("'", "''");
        password = password.replace("'", "''");
        String strSql = "insert into user_table (nom, prenom, telephone, courriel, login, mdp) values ('" + nom + "', '" + prenom + "', '" + telephone + "', '" + courriel + "', '" + login + "', '" + password + "')";
        this.getWritableDatabase().execSQL(strSql);
        Log.i( "DATABASE", "insertUser invoked" );
    }
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Привет, MikeT, большое спасибо за твои объяснения и советы.

Я наконец-то нашел решение своей проблемы, ответ на этот вопрос - проблем на самом деле нет.На самом деле, когда я извлекал свою базу данных, я извлекал ее в той же папке, что и раньше, поэтому Android Studio спрашивала меня, хочу ли я заменить ее, и наивно я нажимал на да, но на самом деле он вообще не заменял,Поэтому, чтобы увидеть новые вставки в базе данных, мне пришлось извлечь его в новую папку, чтобы избежать вопроса замены.Затем я только что установил новое соединение, и все мои новые данные появились!Это было так просто, но я искал не в том направлении.

С уважением,

Новичок

0 голосов
/ 11 апреля 2019

Проблема не в том, что данные не вставляются, а в том, что какой-то метод, который вы используете, чтобы прийти к такому выводу, неверен.

То есть путем внесения изменений в метод insertuser в: -

public void insertUser(String nom, String prenom, String telephone, String courriel, String login, String password) {
    Log.i( "DATABASE", "insertUser invoked" ); //<<<<<<<<<< MOVED AS MORE APPROPRIATE HERE
    nom = nom.replace("'", "''");
    prenom = prenom.replace("'", "''");
    telephone = telephone.replace("'", "''");
    courriel = courriel.replace("'", "''");
    login = login.replace("'", "''");
    password = password.replace("'", "''");
    String strSql = "insert into user_table (nom, prenom, telephone, courriel, login, mdp) values ('" + nom + "', '" + prenom + "', '" + telephone + "', '" + courriel + "', '" + login + "', '" + password + "')";
    this.getWritableDatabase().execSQL(strSql);
    DatabaseUtils.dumpCursor(this.getWritableDatabase().query("user_table",null,null,null,null,null,null)); //<<<<<<<<<< ADDDED to check the data
}
  • Обратите внимание, что приведенная выше строка должна быть удалена, она предназначена только для тестирования, а курсор не закрыт (не закрытие курсора может привести к проблемам).

Это приводит к (примеру): -

04-11 09:25:51.549 10907-10907/aaa.so55617018userIssue I/DATABASE: insertUser invoked
04-11 09:25:51.570 10907-10907/aaa.so55617018userIssue I/DATABASE: onCreate invoked
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@3aabb7c1
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out: 0 {
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out:    idUser=1
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out:    nom=Fred
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out:    prenom=Bloggs
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out:    telephone=1234567890
04-11 09:25:51.577 10907-10907/aaa.so55617018userIssue I/System.out:    courriel=fred@bloggsmail.com
04-11 09:25:51.578 10907-10907/aaa.so55617018userIssue I/System.out:    login=fred
04-11 09:25:51.578 10907-10907/aaa.so55617018userIssue I/System.out:    mdp=fred
04-11 09:25:51.578 10907-10907/aaa.so55617018userIssue I/System.out: }
04-11 09:25:51.578 10907-10907/aaa.so55617018userIssue I/System.out: <<<<<

Скорее всего, ваша проблема заключается в том, что при попытке проверить логин после ввода данных пользователем вы проверяете логин / пароль по значениям, полученным из строк ресурсов, а не базы данных. согласно: -

if(Login.equals(getString(R.string.Login)) && password.equals(getString(R.string.password))) {

Скорее, вы хотите что-то основанное на следующем: -

  1. Метод в помощнике по базе данных, чтобы получить сохраненный пароль для входа в систему (обратите внимание, что вы, вероятно, захотите использовать + " login text UNIQUE not null,", чтобы убедиться, что имя входа в систему UNQIUE (вместе с некоторой проверкой, чтобы предотвратить использование уже использованного имени входа) .

например. : -

public String getPasswordForUser(String login) {
    String rv = "";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor csr = db.query("user_table",null,"login=?",new String[]{login},null,null,null);
    if (csr.moveToFirst()) {
        rv = csr.getString(csr.getColumnIndex("mdp"));
    }
    csr.close();
    return rv;
}
  • Обратите внимание, что если имя пользователя было реплицировано, в приведенном выше примере будет учитываться только первый вход в систему (см. Выше о том, как сделать имя пользователя УНИКАЛЬНЫМ).

  • Обратите внимание, что при изменении значения inlcude UNIQUE в определении столбца входа в систему необходимо выполнить одно из следующих действий, а затем повторно запустить приложение: -

    • удалить данные приложения
    • удалить приложение
    • увеличить номер версии базы данных

, а затем

  1. в MainActivity есть метод проверки, похожий на

: -

private void validate(String Login, String password) {

    SQLiteDatabaseHelper dbhlpr = new SQLiteDatabaseHelper(this);
    String stored_password = dbhlpr.getPasswordForUser(Login); //<<<<<<<<<< not really needed see below

    if (password.equals(dbhlpr.getPasswordForUser(Login))) {
    //if(Login.equals(getString(R.string.Login)) && password.equals(getString(R.string.password))) {
        //Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        //intent.putExtra("Login", Login);
        //startActivity(intent);
        Info.setText("Logged In"); //<<<<<<<<<< ADDED
    } else {
        counter--;

        Info.setText("nb of attempts remaining" + String.valueOf(counter));

        if (counter==0) {
            submit.setEnabled(false);
        }
    }
}
  • Обратите внимание, старый код закомментирован
  • Вам не нужен сохраненный_пароль, вы можете просто сделать проверку как if (password.equals(dbhlpr.getPasswordForUser(Login))) {

ДОПОЛНИТЕЛЬНЫЙ

Запуск MainActivity как попытка возврата данных из действия creationCompte не совсем верный путь. Рекомендуемый способ - запустить creationCompte для результата, установить возвращаемый Намерение и завершить creationCompte , который вернется к MainActivity согласно Получение результата от активность .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...