Как я могу отобразить столбец из моей базы данных в текстовое представление в Android Studio? - PullRequest
0 голосов
/ 28 мая 2018

Эй, ребята, я пробовал это в течение 2 дней, и я не могу заставить его работать.Я перепробовал каждый урок!Я новичок в Android Studio и пытаюсь сделать простое приложение, где я могу зарегистрироваться и войти.Мне удалось создать базу данных и вставить новую строку (пользователя) в базу данных. [Зарегистрировать пользователя].А также я смог войти в систему.

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

Например,После того, как я войду в систему с пользователем, я хочу отобразить его информацию из столбцов, такую ​​как номер телефона, адрес и т. д.

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

databasehelper.java

package easy.eightfivehundred.easy;

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="register.db";
    public  static final String TABLE_NAME="register";
    public  static final String COL_1="ID";
    public  static final String COL_2="FirstName";
    public  static final String COL_3="LastName";
    public  static final String COL_4="HomeAddress";
    public  static final String COL_5="Phone";
    public  static final String COL_6="Email";
    public  static final String COL_7="Password";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName TEXT, LastName TEXT, HomeAddress TEXT, Phone TEXT, Email TEXT, Password TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

}

mainactivity

package easy.eightfivehundred.easy;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
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 MainActivity extends AppCompatActivity {

    SQLiteOpenHelper openHelper;
    SQLiteDatabase db;
    Button Registerbutton, Loginbutton;
    EditText Firstnametxt, Lastnametxt, Homeaddresstxt, Phonenumbertxt, Emailtext, Passwordtext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        openHelper = new DatabaseHelper(this);
        Registerbutton =(Button)findViewById(R.id.RegisterButton);
        Loginbutton = (Button)findViewById(R.id.LogInButton);
        Firstnametxt =(EditText)findViewById(R.id.FirstNameText);
        Lastnametxt =(EditText)findViewById(R.id.LastNameText);
        Homeaddresstxt =(EditText)findViewById(R.id.HomeAddressText);
        Phonenumbertxt =(EditText)findViewById(R.id.PhoneText);
        Emailtext =(EditText)findViewById(R.id.EmailText);
        Passwordtext =(EditText)findViewById(R.id.PasswordText);
        Registerbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                db = openHelper.getWritableDatabase();
                String first = Firstnametxt.getText().toString();
                String last = Lastnametxt.getText().toString();
                String address = Homeaddresstxt.getText().toString();
                String phone = Phonenumbertxt.getText().toString();
                String email = Emailtext.getText().toString();
                String password = Passwordtext.getText().toString();

                insertData(first, last, address, phone, email, password);
                Toast.makeText(getApplicationContext(), "You Registered Successfully!", Toast.LENGTH_LONG).show();
            }
        });

        Loginbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, login.class);
                startActivity(intent);
            }
        });

    }

    public void insertData(String first, String last, String address, String phone, String email, String password) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.COL_2, first);
        contentValues.put(DatabaseHelper.COL_3, last);
        contentValues.put(DatabaseHelper.COL_4, address);
        contentValues.put(DatabaseHelper.COL_5, phone);
        contentValues.put(DatabaseHelper.COL_6, email);
        contentValues.put(DatabaseHelper.COL_7, password);
        long id = db.insert(DatabaseHelper.TABLE_NAME, null, contentValues);
    }

}

login

package easy.eightfivehundred.easy;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
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 login extends AppCompatActivity {

    SQLiteDatabase db;
    SQLiteOpenHelper openHelper;
    Button Loginbutton;
    EditText Emailtext, Passwordtext;
    Cursor cursor;

    public static final String EXTRA_MESSAGE = " ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        openHelper = new DatabaseHelper(this);
        db = openHelper.getReadableDatabase();
        Loginbutton = (Button)findViewById(R.id.loginbutton);
        Emailtext = (EditText)findViewById(R.id.emaillogintext);
        Passwordtext = (EditText)findViewById(R.id.passwordlogintext);
        Loginbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String email = Emailtext.getText().toString();
                String password = Passwordtext.getText().toString();
                cursor = db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_6 + "=? AND " + DatabaseHelper.COL_7 + "=? ", new String[]{email, password});
                if(cursor != null){
                    if(cursor.getCount() > 0){
                        cursor.moveToNext();
                        Toast.makeText(getApplicationContext(), "Login Successful", Toast.LENGTH_LONG).show();

                        Intent intent = new Intent(login.this, UserHome.class);
                        intent.putExtra(EXTRA_MESSAGE, email);
                        startActivity(intent);
                    }
                    else{
                        Toast.makeText(getApplicationContext(), "Error!", Toast.LENGTH_LONG).show();
                    }
                }
            }
        });

    }
}

userhome

package easy.eightfivehundred.easy;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import static easy.eightfivehundred.easy.DatabaseHelper.TABLE_NAME;

public class UserHome extends AppCompatActivity {

    SQLiteDatabase db;
    SQLiteOpenHelper openHelper;
    Cursor cursor;

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

        Intent intent = getIntent();
        String email = intent.getStringExtra(login.EXTRA_MESSAGE);
    }
}

В файле userhome.java у меня возникают проблемы.Я просто хочу отобразить столбцы зарегистрированного пользователя на этой странице.

1 Ответ

0 голосов
/ 28 мая 2018

Это должно помочь вам: -

Шаг 1.

Изменить макет, включив в него TextViews с идентификаторами , которые будут использоваться для отображения извлеченногоданные, например: -

<TextView
    android:id="@+id/firstname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@+id/lastname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@+id/homaddress"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@+id/phone"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@+id/email"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Шаг 2.

Добавить метод (добавлен в DatabAseHelper.java, хотя может быть в другом месте, как ваш InsertData метод в MainActivity.java ) для получения данных в виде курсора.

например: -

public Cursor getUserInfo(String email) {
    SQLiteDatabase db = this.getWritableDatabase();
    String whereclause = COL_6 + "=?"; //<<<< select according to email
    String[] whereargs = new String[]{email};
    return db.query(
            TABLE_NAME,
            null,
            whereclause,
            whereargs,
            null,null,null
            );
}
  • Выше будет равно SELECT * FROM register WHERE Email = '??????'
    • где ??????будет ли строка передана методу.

Шаг 3.

В Userhome.java объявите переменные класса для TextViews , экземпляр ВАШЕГО DatabaseHelper (не SQLiteOpenHelper) и Курсор (у вас это уже есть).

Например: -

TextView mFirstName, mLastName, mHomeAddress, mPhone, mEmail, mPassword;
DatabaseHelper mDBHlpr;
Cursor cursor; 

Шаг 4.

Снова в UserHome.java в качестве метода onCreate используйте: -

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); //<<<< USE YOUR LAYOUT


    Intent intent = getIntent();
    String email = intent.getStringExtra(login.EXTRA_MESSAGE);

    //<<<<<<<<<< NEW CODE >>>>>>>>>>
    mFirstName = (TextView) this.findViewById(R.id.firstname);
    mLastName = (TextView) this.findViewById(R.id.lastname);
    mHomeAddress = (TextView) this.findViewById(R.id.homaddress);
    mPhone = (TextView) this.findViewById(R.id.phone);
    mEmail = (TextView) this.findViewById(R.id.email);
    mPassword = (TextView) this.findViewById(R.id.password);

    mDBHlpr = new DatabaseHelper(this); //<<<< get Instance of DatbaseHelper
    cursor = mDBHlpr.getUserInfo(email); //<<< get the Cursor according to email
    if (cursor.moveToFirst()) {
        mFirstName.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_2)));
        mLastName.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_3)));
        mHomeAddress.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_4)));
        mPhone.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_5)));
        mEmail.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_6)));
        mPassword.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL_7)));
    } else {
        // HANDLE NO DATA THAT MATCHES WHERE CLAUSE
        mFirstName.setText("Sorry No User found that has email as :- " + email);
    }
    cursor.close(); //<<<< DONE WITH THE CURSOR SO CLOSE IT
}
  • Курсор при возврате будет располагаться в позиции перед первым рядом (позиция -1).Чтобы получить данные, вам нужно перейти к строке.
  • Методы move????? возвращают true или false.Первое, если перемещение может быть выполнено (поэтому moveToFirst, если нет строк, вернет false, или true, если есть хотя бы одна строка).Следовательно, как вы можете использовать if (cursor.moveToFirst()){.....}.
  • Таким образом, если есть данные (строка или более, предполагается, что не должно быть пользователей с одинаковым адресом электронной почты), TextView заполняются (в противном случае, т.е.первое имя TextView указывает, что пользователь не найден (хотя это не должно произойти)).
  • Данные извлекаются из Курсор с использованием get????? (getString в этом случае, есть другие методытакие как getInt, getLong ......).
  • Методы get???? принимают целое число, смещение столбца (первый столбец ID * 1074)* смещено 0 , 2-е имя смещено 1 ......).Однако использование жестко закодированных смещений может легко привести к проблемам, поэтому рекомендуется использовать Курсор getColumnIndex, который возвращает смещение столбца в соответствии с именем столбца (более гибкий).
  • Обратите внимание, как имена столбцовполученный из DatabaseHelper , использование этого способа снижает вероятность ошибок при вводе.
    • Вы можете рассмотреть возможность изменения метода onCreate в DatabaseHelper , чтобы также использовать этот единственный источник для имен столбцов с помощью (замененный код закомментирован).

: -

@Override
public void onCreate(SQLiteDatabase db) {

    String crt_sql = "CREATE TABLE " + TABLE_NAME + "(" +
            // Note AUTOINCREMENT is very likely not needed
            // refer to https://sqlite.org/autoinc.html
            COL_1 + " INTEGER PRIMARY KEY, " +
            COL_2 + " TEXT, " +
            COL_3 + " TEXT, " +
            COL_4 + " TEXT, " +
            COL_5 + " TEXT, " +
            COL_6 + " TEXT, " +
            COL_7 + " TEXT " +
            ")";
    db.execSQL(crt_sql);
    /*
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "FirstName TEXT, LastName TEXT, HomeAddress TEXT, Phone TEXT, Email TEXT, Password TEXT)");
            */
}
  • Возможно, вы захотите взглянуть на SQLite Autoincrement в отношении исключения ключевого слова AUTOINCREMENT.

  • Вы также можете посмотреть Курсор для многочисленных Курсоров методов (например, get???? и move?????)

Тестирование

Выше было проверено добавление пользователя с именем Фред, фамилия FlitStone ... с использованием этого фрагмента кода: -

        mDBHlpr.insertUser("Fred",
                "Flintsone",
                "1 The Caves, Bedrock",
                "01 2345 6789",
                email_for_testing,
                "fredflintsone"
        );

в результате: -

enter image description here

...