Таблица не создается в студии Android - PullRequest
0 голосов
/ 24 ноября 2018

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

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

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "People.db";
public static final String TABLE_NAME = "user";
public static final String COL1 = "email";
public static final String COL2 = "password";


public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1); 
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(" +
    COL1 + "TEXT PRIMARYKEY," + 
    COL2 + "TEXT)");
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}
/*Inserting into database*/

  public boolean add(String email, String password) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();  
    to database
    contentValues.put(COL1, email);
    contentValues.put(COL2, password);
    long ins = db.insert(TABLE_NAME, null, contentValues);

    if (ins == -1) return false;
    else return true;
    }

    /*checking if email exist*/
    public Boolean chkemail(String email) {

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * from TABLE_NAME where email = ?", 
    new String[]{email});
    if (cursor.getCount() > 0) return false;
    else return true;

    }
  }

Это действие SignUp, которое вставляет и проверяет информацию.

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;
import com.powell.randomeats.MainActivity;
import com.powell.randomeats.R;

public class SignUp extends AppCompatActivity {

DatabaseHelper db;
EditText email, pass, pass1;
Button sign;
boolean optionsSwitch;

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

    db = new DatabaseHelper(this);
    email = (EditText) findViewById(R.id.Email);
    pass = (EditText) findViewById(R.id.Password);
    pass1 = (EditText) findViewById(R.id.Confirm);
    sign = (Button) findViewById(R.id.Signup);


    sign.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String s1 = email.getText().toString();
            String s2 = pass.getText().toString();
            String s3 = pass1.getText().toString();
            if (s1.equals("") || s2.equals("") || s3.equals("")) {
                Toast.makeText(getApplicationContext(), "Fields are empty", 
            Toast.LENGTH_SHORT).show();

            } else {
                if (s2.equals(s3)) {
                    Boolean chkemail = db.chkemail(s1);
                    if (chkemail == true) {
                        Boolean insert = db.add(s1, s2);
                        if (insert == true) {
                            Toast.makeText(getApplicationContext(), 
                            "Registered Succesfully", 
                            Toast.LENGTH_SHORT).show();
                            Log();
                            if (optionsSwitch == true) {
                                openLog();
                            }

                        }
                    } else {
                        Toast.makeText(getApplicationContext(), "Email 
                        Already exists,", Toast.LENGTH_SHORT).show();

                    }

                } else {
                    Toast.makeText(getApplicationContext(), "Passwords do 
                not match", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });


 }

public void Log() {
    optionsSwitch = true;
}

public void openLog() {
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
  }

}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Измените эту строку:

Cursor cursor = db.rawQuery("SELECT * from TABLE_NAME where email = ?", new String[]{email});

на

Cursor cursor = db.rawQuery("SELECT * from " + TABLE_NAME + " where email = ?", new String[]{email});

, чтобы имя таблицы в выражении sql было users, а не TABLE_NAME.

0 голосов
/ 24 ноября 2018

Ваш вопрос (ы)

Я считаю, что таблица создается.Однако не с ожидаемыми именами столбцов.

Это связано с тем, что допускаются пробелы, оператор create разрешается в: -

CREATE TABLE user (emailTEXT PRIMARYKEY, passwordTEXT);

В связи с этим в таблице будут столбцы emailTEXT, а не email иpasswordText, а не password.

Это вызовет проблемы, когда попытка использовать столбцы email и пароль, так как эти столбцы не существуют.

Дополнительный PRIMARYKEY недопустим в качестве ключевого слова, поэтому измените оператор create на

CREATE TABLE user (email TEXT PRIMARYKEY, password TEXT);

Создаст таблицу с правильными столбцами, НО столбец электронной почты не будет отклонять повторяющиеся значения.

Таким образом, вам нужно добавить пробел между PRIMARY и KEY, поэтому создание должно быть: -

CREATE TABLE user (email TEXT PRIMARY KEY, password TEXT);

Предлагаемое исправление

Ваш код может быть изменен на: -

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(" +
    COL1 + " TEXT PRIMARY KEY," + 
    COL2 + " TEXT)");
    }

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

  1. Удалить данные приложения (удалить базу данных).
  2. деинсталлируйте приложение (удаляет базу данных).
  3. Увеличьте версию базы данных (4-й параметр вызова супер, например, используйте super(context, DATABASE_NAME, null, 2); ( 1 , изменено на 2 * 1038)*)) (вызывает метод onUpgrade , и поэтому таблица удаляется, а затем вызывается onCreate .).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...