- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
嘿伙计们,我已经尝试了两天了,但我似乎无法让它发挥作用。我已经尝试了每个教程!我是 android studio 的新手,一直在尝试制作一个可以注册和登录的简单应用程序。我能够创建数据库并向数据库插入新行(用户)。[注册用户]。而且我还能够让用户登录。
我现在想做的是从行中检索一列或一列并将其显示在 TextView 中。
例如,一旦我使用用户登录,我想从列中显示他们的信息,例如电话号码、地址等。
当应用程序首次启动时,会有一个注册 Activity 。您可以注册或继续登录 Activity 。一旦您从登录 Activity 登录,就会有一个新 Activity ,我想在其中显示该登录用户的信息。
数据库助手.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);
}
}
主要 Activity
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);
}
}
登录
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();
}
}
}
});
}
}
用户主页
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 文件中我遇到了麻烦。我只想在此页面上显示登录用户的列。
最佳答案
这应该能让你上路:-
修改布局以包含带有 ID 的 TextView,用于显示提取的数据,例如:-
<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" />
添加一个方法(添加到 DatabAseHelper.java,尽管也可以在其他地方,例如 MainActivity.java 中的 InsertData
方法)以获取游标形式的数据。
例如:-
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
);
}
从寄存器中选择 * WHERE Email = '??????'
在Userhome.java中声明TextViews的类变量、您的DatabaseHelper实例(不是SQLiteOpenHelper)和Cursor(您已经有了这个)。
例如:-
TextView mFirstName, mLastName, mHomeAddress, mPhone, mEmail, mPassword;
DatabaseHelper mDBHlpr;
Cursor cursor;
再次在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
}
move??????
方法返回 true 或 false。前者如果可以进行移动(因此 moveToFirst
,如果没有行将返回 false,如果至少有一行则返回 true)。因此,您可以如何使用 if (cursor.moveToFirst()){.....}
。get??????
从Cursor中提取数据(本例中为getString
,还有其他方法如getInt
、getLong
……)。get??????
方法采用一个整数,即列偏移量(第一列ID 是偏移量0,第二列firstname 是偏移量1 ......)。不过,使用硬编码的偏移量很容易出现问题,因此建议使用 Cursor getColumnIndex
,它根据列名返回列偏移量(更灵活)。onCreate
方法,以便通过使用(已注释掉的替换代码)也使用此单一源作为列名称。:-
@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就排除 AUTOINCRMENT 关键字而言。
您可能还希望查看Cursor对于众多 Cursor 方法(例如 get??????
和 move??????
)
通过使用以下代码 fragment 添加一个名字为 Fred、姓氏为 FlitStone 的用户来测试上述内容:-
mDBHlpr.insertUser("Fred",
"Flintsone",
"1 The Caves, Bedrock",
"01 2345 6789",
email_for_testing,
"fredflintsone"
);
结果:-
关于java - 如何在 Android Studio 中将数据库中的列显示到 TextView 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50557389/
我在activity_main.xml中有一个Textview设计,我想用它来在另一个textview下面显示一个textview。我从 stackoverlow 本身获取了这段代码,并做了一些更改以
伙计们,我尝试添加另一个 TextView ,但是当我尝试时,新的 TextView 已放置在前一个 TextView 上,如何使第二个 TextView 作为新的第二个 TextView 下降 这是
现在 textview 显示如果我将滚动到底部的语句。看起来 promis textview 变大了。有办法解决吗? 星号下的所有内容都是 promis textview 的一部分。它是一个带有多个换
我有多个 TextView 。所有 TextView 都是一个单词。我想用它们来构建一个段落。但他们不应该失去他们的 TextView 功能。因此它们不应该用作字符串。因为那样的话,我希望它们可以一一
附件是指向我的应用程序屏幕截图的链接和显示我想要实现的功能的视频的链接。基本上我想要的是当我单击任何功能区上的“更多”按钮时,它应该自行展开并且用从 JSON 文件中获取的数据替换文本。功能区的高度应
我想显示 edittext 中的文本,但由于输入了大量字符,布局被破坏了。我如何限制在 textview 上显示的字符数 最佳答案 你可以尝试在 Edittext actionlistener 上使用
是否可以将 textview 环绕在 textview 周围,第二个 textview 将环绕到第一个 textview 下的下一行? 例如: 我尝试过使用 android:layout_weig
假设我有 10 个文本项,所有这些项都对用户可见。每个文本项都有不同的颜色和样式。我不知道实现此目标的最佳方法是什么。 多个静态 TextView - 最容易实现,但性能可能最差。 TextView
我正在尝试创建一个布局,其中有两个 TextViews 彼此相邻。第一个 TextView 具有可变长度并且是单行的。第二个 TextView 包含一个固定标签,应该不被省略。第二个标签必须紧挨着第一
我正在使用 onTouchEvent 方法来缩放 TextView ,但是当我有两个 TextView 并且我只想调整第一个 TextView 而不是第二个 TextView 时,我遇到了麻烦。我的意
在我的 android 应用程序中,我有一个自动完成 TextView 字段,可以向用户建议不同的州名称。代码如下: ArrayAdapter state_adapter=new ArrayAdap
我怎样才能让 textview 开始一个新行,一直从左边开始,同时保留属性“toTheRightOf”username25? 像这样: 最佳答案 我的猜测是 twitch 应
我正在做一个动态 TextView 的例子,它是通过按下一个按钮创建的。它们的创建格式类似于: 1- Textview (fist created) 2- TextView 3- TextView (
我想要 TextView 和描述的自动调整大小的文本 here .我想,“测试”这个词应该在单行上对齐,但它是基于字符包装的(参见另一行的“g”)。我应该如何更改我的配置,以便一切都按我的意愿工作?
我有一个简单的布局,在两个 ImageView 之间包含一个 TextView。 当我在运行时使用“setText()”更改 TextView 时,它发生了变化,但失去了“center_horizo
作为 Android 初学者,我正在尝试显示一棵树。我已经找到了如何以编程方式添加新的 TextView,但我不知道如何放置它们,我的意思是如何根据父节点设置它们的填充/边距。 非常感谢您的回答, 巴
对于 AndroidTV,我创建了一个简单的搜索栏和 TextView 。我正在尝试对齐搜索栏拇指的 TextView 并尝试随着进度移动。 尝试了这些解决方案,但不起作用 link1 , link2
我是 Android Studio 新手,正在编写应用程序。 我正在尝试它,我想知道如何在 Textview1 包含某些内容的情况下启用(例如)Textview2。 我尝试了这段代码,但它不起作用:
我从这里获取 TextView 实例: TextView date = null; try { date = (TextView) getLayoutI
这是在别处被问到的,但解决方案对我不起作用。所以用更多的背景再次摆姿势。问题是一个 Activity 包含一个滚动的音乐标题 TextView ,它被更新的耗时计数器 TextView 中断。 我的
我是一名优秀的程序员,十分优秀!