Как получить данные из SQLite и просмотреть их в TextView? - PullRequest
0 голосов
/ 10 ноября 2018

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

DataBaseHelper.java

public class DataBaseHelper extends SQLiteOpenHelper
{
    private DataBaseHelper dbHelper;
    public static SQLiteDatabase m_db;
    public static final String DB_NAME = "users.dbHelper";
    public static final int DB_VERSION = 1;
    public static final String TABLE_USERS = "users";
    public static final String COLUMN_EMAIL = "email";
    public static final String COLUMN_PASSWORD = "password";
    public static final String [] ALL_COLUMNS = {COLUMN_EMAIL, COLUMN_PASSWORD};
    public static final String SQL_CREATE =
            "CREATE TABLE IF NOT EXISTS " + TABLE_USERS + " (" +
                    COLUMN_EMAIL + " STRING PRIMARY KEY, " +
                    COLUMN_PASSWORD + " STRING);";
    public static final String SQL_DROP = "DROP TABLE " + TABLE_USERS;
    public DataBaseHelper(@Nullable Context context)
    {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL(SQL_CREATE);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        db.execSQL(SQL_DROP);
        onCreate(db);
    }

    //---opens the database---
    public DataBaseHelper open() throws SQLException
    {
        m_db = dbHelper.getWritableDatabase();
        return this;
    }

    //---closes the database---
    public void close()
    {
        if (m_db != null)
            m_db.close();
        if (dbHelper != null)
            dbHelper.close();
    }

    // Inserting in database
    public boolean insert(String email, String password)
    {
        m_db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("email", email);
        contentValues.put("password", password);
        long ins = m_db.insert(TABLE_USERS, null, contentValues);
        if (ins == -1) return false;
        else return true;
    }

    // Checking if email exists
    public boolean checkEmail(String COLUMN_EMAIL)
    {
        m_db = this.getWritableDatabase();
        Cursor cursor = m_db.rawQuery("select * from TABLE_USERS where COLUMN_EMAIL=?",
        new String[]{COLUMN_EMAIL});
        if (cursor.getCount() > 0) return false;
        else return true;
    }

    // Checking the email and password
    public boolean checkEmailPassword(String COLUMN_EMAIL, String COLUMN_PASSWORD)
    {
        m_db = this.getWritableDatabase();
        Cursor cursor = m_db.rawQuery("select * from TABLE_USERS where COLUMN_EMAIL=?
        and COLUMN_PASSWORD=?", new String[]{COLUMN_EMAIL, COLUMN_PASSWORD});
        if (cursor.getCount() > 0) return true;
        else return false;
    }

    public String getEmail(String COLUMN_EMAIL)
    {
        m_db = this.getReadableDatabase();
        Cursor cursor = m_db.query(TABLE_USERS, new String[]{COLUMN_EMAIL}, null, null,
        null, null, null);
        cursor.moveToFirst();
        String user = cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL));
        cursor.close();
        return user;
    }
}

WelcomeActivity.Java

public class WelcomeActivity extends AppCompatActivity
{
    private static int SPLASH_TIME_OUT = 4000;
    private DataBaseHelper db;
    private SQLiteDatabase m_db;
    private TextView tvEmail2;

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

        db = new DataBaseHelper(this);

        TextView tvEmail = findViewById(R.id.tvEmail2);
        String email = db.getEmail(DataBaseHelper.COLUMN_EMAIL);
        String user = email;

        tvEmail.setText(Users.class.getEm);

        new Handler().postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                Intent intent = new Intent(WelcomeActivity.this, EthicsActivity.class);
                startActivity(intent);
                finish();
            }
        }, SPLASH_TIME_OUT);
    }
}

Users.java

public class Users
{
    private String email;
    private String password;
    public Users() {}

    public Users(String email, String password)
    {
        this.email = email;
        this.password = password;
    }

    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    @Override
    public String toString()
    {
        return "Users{" +
                "email='" + email + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

Что вы, ребята, думаете об этом?Я пытаюсь извлечь свою электронную почту из моего SQLiteDbHelper и просмотреть ее в TextView в другом действии после того, как я нажму на вход в систему, используя действие WelcomeActivity или заставку, поскольку я хочу, чтобы оно просматривалось только в течение 4 секунд, но я не знаю, в чем проблема, когда явход в систему вылетает из меня.

1 Ответ

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

Я считаю, что у вас есть ряд вопросов.

Строка tvEmail.setText(Users.class.getEm); не будет компилироваться. Я считаю, что вместо этого нужно tvEmail.setText(user); или tvEmail.setText(email); (вам не нужно, чтобы строки email и user имели одинаковое значение).

Если предположить, что EthicsActivity является допустимым рабочим действием, и что в манифесте имеется соответствующая запись активность , то AndroidManifest.xml , тогда проблема заключается в том, что вы получите сообщение об ошибке строки: -

11-10 19:56:12.863 1170-1170/so53240174.so53240174 E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{so53240174.so53240174/so53240174.so53240174.WelcomeActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
        at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)
        at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
        at so53240174.so53240174.DataBaseHelper.getEmail(DataBaseHelper.java:96)
        at so53240174.so53240174.WelcomeActivity.onCreate(WelcomeActivity.java:25)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
        at android.app.ActivityThread.access$600(ActivityThread.java:130) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:137) 
        at android.app.ActivityThread.main(ActivityThread.java:4745) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
        at dalvik.system.NativeStart.main(Native Method) 

Это говорит о том, что курсор пуст, поэтому вы не можете получить от него никаких данных, и это происходит в строке String user = cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL));, которая находится в методе getEmail , как указано в строка в журнале: -

at so53240174.so53240174.DataBaseHelper.getEmail(DataBaseHelper.java:96)

Причина, по которой это происходит, заключается в том, что а) в таблице users нет строк и b) что результат метода Cursor moveToFirst не проверяется. Вместо этого делается предположение, что он всегда будет перемещаться в первый ряд в Курсоре.

Вместо метода getEmail используется: -

public String getEmail(String COLUMN_EMAIL)
{
    m_db = this.getReadableDatabase();
    Cursor cursor = m_db.query(TABLE_USERS, new String[]{COLUMN_EMAIL}, null, null,
            null, null, null);
    cursor.moveToFirst(); //<<<<<<<<<< WRONG
    String user = cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL));
    cursor.close();
    return user;
}

Это может быть: -

public String getEmail(String COLUMN_EMAIL) {
    String user = "No Email Found."; //<<<<<<<<<< Default value in case of empty table
    m_db = this.getReadableDatabase();
    Cursor cursor = m_db.query(TABLE_USERS, new String[]{COLUMN_EMAIL}, null, null,
            null, null, null);
    if (cursor.moveToFirst()) { //<<<<<<<<<< checks result of the move
        user = cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL));
    }
    cursor.close();
    return user;
}

Конечно, применение этого исправления, если строка не добавлена ​​в таблицу users , всегда приведет к тому, что TextView отобразит Email Email Found . Если имеется несколько строк, то будет отображаться электронное письмо из одной из строк, не обязательно определенной строки.

Добавление строки db.insert("fred@fredmail.com","1234567890"); до получения значения с помощью вызова getEmail приводит к отображению fred@fredmail.com в TextView.

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