Member 12853279 Ответов: 1

Как остановить мою программу от создания базы данных заново в android sqlite?


Я делаю приложение, которое требует, чтобы я проверил, существует ли база данных, иначе я ее создаю.Мой код работает в первый раз. Но впоследствии, когда я пытаюсь вызвать другие методы внутри класса, содержащего конструктор sqlite, моя прежняя база данных стирается и создается новая, потому что я вызываю конструктор.

Что я уже пробовал:

package com.pass;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    String DB_NAME = "passManager.db";
    String TAG = "MY DATABASE";

    Database database;
    //FOR REGISTRATION
    EditText MASTER_EM, MASTER_PASS, MASTER_CPASS, MASTER_QUES, MASTER_ANS;
    String masterEmail, masterPass, masterConfirmPass, masterQuestion, masterAnswer;
    Context context;

    //FOR LOGIN
    EditText TEXTEMAIL, TEXTPASSWORD;
    String loginEmail, loginPassword;
    Button btn,btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        boolean status = dataBaseExist(DB_NAME);
        database = new Database(context);
        if(status){

            setContentView(R.layout.register);
            //collect values from UI for registration
            MASTER_EM = (EditText) findViewById(R.id.MASTER_EMAIL_REG);
            MASTER_PASS = (EditText) findViewById(R.id.MASTER_PASSWORD_REG);
            MASTER_CPASS = (EditText)findViewById(R.id.RMASTER_PASSWORD);
            MASTER_QUES = (EditText) findViewById(R.id.QUESTION);
            MASTER_ANS = (EditText) findViewById(R.id.ANSWER);
            btn = (Button) findViewById(R.id.REGISTER_ACCT);
            btn.setOnClickListener(this);
        }
        else{
            setContentView(R.layout.activity_main);

            //collect values from UI for login
            TEXTEMAIL = (EditText) findViewById(R.id.txtemail);
            TEXTPASSWORD = (EditText) findViewById(R.id.txtpass);

            btn2 = (Button)findViewById(R.id.btnsignin);
            btn2.setOnClickListener(this);

        }

    }

   private boolean dataBaseExist(String databaseName){
       boolean val = false;
       File database=getApplicationContext().getDatabasePath(databaseName);
       //File d = getApplicationContext().getFilesDir().getPath(databaseName);

       if (!database.exists()) {

           val = true;
           Log.i("My Database", "Not Found");

       } else {

           Log.i("My Database", "Found");
       }

       return val;
   }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.REGISTER_ACCT :

                masterPass = MASTER_PASS.getText().toString();
                masterConfirmPass = MASTER_CPASS.getText().toString();
                masterEmail = MASTER_EM.getText().toString();
                masterQuestion = MASTER_QUES.getText().toString();
                masterAnswer = MASTER_ANS.getText().toString();

                    if(!masterPass.equals(masterConfirmPass)){

                        Toast.makeText(this, "PASSWORD & PASSWORD CONFIRM DID NOT MATCH", Toast.LENGTH_LONG).show();

                    }
                    else {
                        //Save the Data to Database
                        UserInfoAsynctask userInfoAsynctask = new UserInfoAsynctask(context);
                        userInfoAsynctask.execute("insert",masterEmail,masterPass,masterQuestion,masterAnswer);

                        //Restart app
                        Intent i = getBaseContext().getPackageManager()
                                .getLaunchIntentForPackage( getBaseContext().getPackageName() );
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(i);

                    }
                break;
            case R.id.btnsignin :
                loginEmail = TEXTEMAIL.getText().toString();
                loginPassword = TEXTPASSWORD.getText().toString();
                long check = database.authMaster(loginEmail, loginPassword);
                    if(check == 1){
                        Intent intent = new Intent(MainActivity.this, Profile.class);
                        intent.putExtra("email", loginEmail);
                        startActivity(intent);
                    }
                break;

        }
    }
//Here is the Class for the Database 
package com.pass;

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

public class Database extends SQLiteOpenHelper {

    //LOGCAT MESSAGE TAG
    private static final String LOGCAT = "DATABASE CLASS : ";

    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "passManager.db";

    // Table Names
    private static final String TABLE_SITES = "sites";
    private static final String TABLE_NOTES = "notes";
    private static final String TABLE_USER = "user";
    private static final String TABLE_NOTE_CAT = "note_cat";

    // SITES Table - column nmaes
    private static final String URL_ID = "url";
    private static final String USERNAME = "username";
    private static final String PASSWORD = "password";

    // NOTES Table - column names
    private static final String NOTE_ID = "note_id";
    private static final String NOTES_NOTE_CAT = "note_cat";
    private static final String NOTE_DESC = "note_desc";
    private static final String NOTE_BODY = "note_body";
    private static final String NOTE_DATE = "note_date";



    // NOTE CATEGORY TABLE - column names
    private static final String CAT_ID = "note_cat";
    private static final String CAT_DESC = "desc";

    //MASTER USER ACCOUT TABLE
    private static final String USER_ID = "email";
    private static final String USER_PASSWORD = "password";
    private static final String USER_QUESTION = "question";
    private static final String USER_ANSWER = "answer";

    //CREATE TABLE QUERIES [USER ACCOUNT]
    private static final String CREATE_TABLE_USER_ACCT = "CREATE TABLE "
            + TABLE_USER
            + "("
            + USER_ID + " TEXT PRIMARY KEY,"
            + USER_PASSWORD + " TEXT,"
            + USER_QUESTION + " TEXT,"
            + USER_ANSWER + " TEXT"
            + ")";

    /* NOTE CAT table create statement */
    private static final String CREATE_TABLE_NOTE_CAT = "CREATE TABLE " + TABLE_NOTE_CAT
            + "(" + CAT_ID + " TEXT PRIMARY KEY," + CAT_DESC + " TEXT" + ")";

    /* NOTES table create statement */
    private static final String CREATE_TABLE_NOTES = "CREATE TABLE "
            + TABLE_NOTES + "(" + NOTE_ID + " TEXT PRIMARY KEY," + NOTES_NOTE_CAT + " TEXT," + NOTE_DESC
            + " TEXT," + NOTE_BODY + " TEXT," + NOTE_DATE
            + " TEXT" + ")";

    /* Sites table create statement */
    private static final String CREATE_TABLE_SITES = "CREATE TABLE "
            + TABLE_SITES + "(" + URL_ID + " TEXT PRIMARY KEY," + USERNAME
            + " TEXT," + PASSWORD + " TEXT" + ")";

    public Database(Context context) {

        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        Log.d("Database ",DATABASE_NAME+" Created");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //create tables
        db.execSQL(CREATE_TABLE_SITES);
        Log.d("Tables ",TABLE_SITES + " created");

        db.execSQL(CREATE_TABLE_NOTE_CAT);
        Log.d("Tables ",TABLE_NOTE_CAT + " created");

        db.execSQL(CREATE_TABLE_NOTES);
        Log.d("Tables ",TABLE_NOTES + " created");

        db.execSQL(CREATE_TABLE_USER_ACCT);
        Log.d("Tables ",CREATE_TABLE_USER_ACCT + " created");
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // on upgrade drop older tables
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTE_CAT);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTES);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_SITES);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
        Log.d("Tables ",TABLE_SITES + " created");
        // create new tables
        onCreate(db);
    }

    //INSERT INTO USER ACCT TABLE
    public long createUser(String email,String password,String question,String answer){

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(USER_ID, email);
        values.put(USER_PASSWORD, password);
        values.put(USER_QUESTION, question);
        values.put(USER_ANSWER, answer);

        Log.d("Reply","User Created....Sucessfully");
    return db.insert(TABLE_USER,null,values);


    }
    public long authMaster(String userName, String pass) {
        Log.i("NOTE ", userName + "+" + pass);
    return 1;
    }
}

Richard MacCutchan

Я не вижу нигде в приведенном выше коде, где вы создаете базу данных. Что я упускаю?

Member 12853279

Ричард Маккатчан, я обновил вопрос.

Richard MacCutchan

Этот код все еще выглядит запутанным, и я не могу понять, где вы вызываете базу данных, чтобы добавить запись, не создавая новую базу данных. Я рекомендую вам поработать над статьей, которую написал Питер (см. Его ссылку), так как она объясняет это очень подробно.

Member 12853279

Он находится внутри метода onCreate. Чуть ниже контекста = это. Но могу я спросить вас? Если бы у меня было больше методов внутри того, который содержит конструктор sqlite, разве мне не нужно было бы всегда вызывать конструктор, прежде чем я смогу получить доступ к другим методам?

Richard MacCutchan

Да, вы всегда вызываете конструктор как часть инициализации вашего класса базы данных. У меня возникли проблемы с тем, чтобы увидеть, где в вашей основной программе вы на самом деле вызываете какой-либо из методов базы данных. Я вижу комментарий //Save the Data to Database, но я не могу понять, что должен делать следующий за ним код.

Member 12853279

Это внутри моего класса базы данных. Прошу прощения за то, что не был откровенен. Следующий код: / / сохраните данные в базе данных
UserInfoAsynctask userInfoAsynctask = новый UserInfoAsynctask (контекст);
userInfoAsynctask. execute ("insert", masterEmail,masterPass,masterQuestion, masterAnswer); это то, что я использую для вызова класса asynctask, который вызывает метод createUser (), находящийся внутри класса базы данных

Richard MacCutchan

Почему? i) это значительно затрудняет понимание кода. ii) это означает, что вы всегда создаете новую базу данных.

Как я уже предлагал ранее, прочтите статью Питера Леоу и посмотрите, как легко это сделать правильно.

Member 12853279

Большое спасибо. Ты дал мне то, что мне нужно...Просматриваю путеводитель Питера Леоу.

1 Ответов

Рейтинг:
8