Java 从数据库加载用户数据并将其传递到intent extras的正确方法是什么
我正在做的项目允许用户注册和登录,所有的工作都很完美,直到我发现代码有问题。它不算作错误,因为编译器认为它不是错误。这只是一个bug,或者人们管它叫什么。下面是发生的事情。用户登录到其帐户后,数据库将其数据传输到Java 从数据库加载用户数据并将其传递到intent extras的正确方法是什么,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在做的项目允许用户注册和登录,所有的工作都很完美,直到我发现代码有问题。它不算作错误,因为编译器认为它不是错误。这只是一个bug,或者人们管它叫什么。下面是发生的事情。用户登录到其帐户后,数据库将其数据传输到intent extras。然后在接下来的活动中,用户名、硬币和宝石会出现在页面顶部,以便用户知道他们还剩下多少硬币。出于测试目的,我添加了添加硬币和减少硬币按钮。尽管如此,代码仍然可以完美地工作。但在用户注销并重新登录后,硬币将回到原始金额。我知道在User.java类中给coin变量
intent extras
。然后在接下来的活动中,用户名、硬币和宝石会出现在页面顶部,以便用户知道他们还剩下多少硬币。出于测试目的,我添加了添加硬币和减少硬币按钮。尽管如此,代码仍然可以完美地工作。但在用户注销并重新登录后,硬币将回到原始金额。我知道在User.java
类中给coin变量赋值会导致问题。尽管如此,在登录时,我还是将用户的硬币和宝石的默认值放入了intent extras中。我就是找不到在用户登录时如何将数据库中的值添加到intent extras中的方法。
下面是登录活动的代码
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Check user input is correct or not
if (validate()) {
//Get values from EditText fields
String Email = editTextEmail.getText().toString();
String Password = editTextPassword.getText().toString();
User player1 = new User(null, null, Email, Password);
//Authenticate user
User currentUser = myDb.Authenticate(player1);
//Check Authentication is successful or not
if (currentUser != null) {
System.out.println("Success");
Bundle extras = new Bundle();
extras.putString("P_ID", currentUser.getId());
extras.putString("P_NAME", currentUser.getName());
extras.putInt("P_COINS", currentUser.getCoins());
extras.putInt("P_GEMS", currentUser.getGems());
Intent intent = new Intent(getApplicationContext(),HomeActivity.class);
intent.putExtras(extras);
startActivity(intent);
finish();
} else {
//User Logged in Failed
System.out.println("Failed");
}
}
}
});
家庭活动
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Set fullscreen and no title//////////
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
///////////////////////////////////////
setContentView(R.layout.home_screen);
myDb = new DatabaseHelper(this);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
pid = extras.getString("P_ID");
pname = extras.getString("P_NAME");
pcoins = extras.getInt("P_COINS");
pgems = extras.getInt("P_GEMS");
nametxt = (TextView)findViewById(R.id.playernametext);
coinstxt = (TextView)findViewById(R.id.playercoinstext);
gemstxt = (TextView)findViewById(R.id.playergemstext);
addcoin = (Button)findViewById(R.id.addbtn);
decoin = (Button)findViewById(R.id.decbtn);
nametxt.setText(" " +String.valueOf(pname) +" ");
coinstxt.setText(" Coins : " +String.valueOf(pcoins) +" ");
gemstxt.setText(" Gems : " +String.valueOf(pgems) +" ");
addcoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pcoins += 10;
boolean isUpdate = myDb.updateUser(pid, pname, String.valueOf(pcoins), String.valueOf(pgems));
if (isUpdate == true) {
nametxt.setText(" " +String.valueOf(pname) +" ");
coinstxt.setText(" Coins : " +String.valueOf(pcoins) +" ");
gemstxt.setText(" Gems : " +String.valueOf(pgems) +" ");
}
}
});
decoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pcoins -= 10;
boolean isUpdate = myDb.updateUser(pid, pname, String.valueOf(pcoins), String.valueOf(pgems));
if (isUpdate == true) {
nametxt.setText(" " +String.valueOf(pname) +" ");
coinstxt.setText(" Coins : " +String.valueOf(pcoins) +" ");
gemstxt.setText(" Gems : " +String.valueOf(pgems) +" ");
}
}
});
}
当然还有用户类
public class User {
public String id;
public String userName;
public String email;
public String password;
public int coins = 1000;
public int gems = 10;
public User(String id, String userName, String email, String password) {
this.id = id;
this.userName = userName;
this.email = email;
this.password = password;
}
public String getId() {
return this.id;
}
public String getName() {
return this.userName;
}
public void addCoins(int addAmount) {
this.coins = addAmount;
}
public void decCoins(int decAmount) {
this.coins = decAmount;
}
public int getCoins() {
return this.coins;
}
public void addGems(int addAmount) {
this.gems = addAmount;
}
public void decGems(int decAmount) {
this.gems = decAmount;
}
public int getGems() {
return this.gems;
}
}
老实说,我的大脑缺乏逻辑。这就是为什么我来这里,看看我的代码是否有意义。
如果你不明白我的意思,请问我是哪一部分,请不要立即标记我的问题。相信我,我的英语真的很差。我建议只传递用户ID(永远不应该更改),然后总是从数据库中获取硬币等值,并且只在数据库中更改它们(然后从数据库中的值重置显示的值)
这样,您就不会有试图处理两组数据的问题,您将依赖于真实数据,即数据库中的数据
工作示例
下面是一些介绍基本知识的代码
当它启动MainActivity时,当您登录时会立即启动LoginActivity,然后它会将您带到HomeActivity。这将显示当前用户ID、用户名、硬币(最初为0)和宝石
有两个按钮Add10Coins和Add10gems单击它们将把新值应用到显示更新值的数据库。如果您停止应用程序并重新运行,请登录,然后值将保持原样
以智能方式传递值,尽管LoginActivity设置了3个额外值,但是HomeActivity只使用了一个值(用户ID为long),但是根据显示的值,所有值都是可访问的。如果启动了另一个活动,那么您所要做的就是通过intent传递userid
这段代码不是我所说的复杂代码,但我肯定会建议您仔细阅读并试着理解它
user.java
我添加了一些方法,还添加了一些常量,现在是:-
public class User {
public static final int ADJUSTTYPE_ADD = 1;
public static final int ADJUSTTYPE_REPLACE = 2;
public static final int ADJUSTTYPE_MULTIPLY = 3;
public static final int ADJUSTTYPE_DIVIDE = 4;
String id;
String userName;
String email;
String password;
int coins;
int gems;
public User(String id, String userName, String email, String password) {
this.id = id;
this.email = email;
//And so on. Don't mind this
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setName(String userName) {
this.userName = userName;
}
public String getName() {
return this.userName;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setCoins(int coins) {
this.coins = coins;
}
public int getCoins() {
return this.coins;
}
public void setGems(int gems) {
this.gems = gems;
}
public int getGems() {
return this.gems;
}
public long getLongId() {
long id;
try {
id = Long.valueOf(this.id);
} catch (Exception e) {
return -1;
}
return id;
}
}
DatabaseHelper.java
这是从零开始写的,不是基于对代码最严格的检查,它在很大程度上会受到我的样式/使用技术的影响,但不会影响到我申请真正开发的程度
其中是方法adjustCoinsAndOrGems这是用来更新数据库和返回用户中的宝石或硬币的方法(以便返回用户的同步版本,而不是使用此返回使用(我个人更喜欢访问数据库,只要它不是问题)(例如,显著影响绩效)
登陆界面
这非常简单,请注意,目前您必须登录,并且两个用户的电子邮件和密码在MainActivity中进行了编码。正确提供后,HomeActivity将启动:-
公共类LoginActivity扩展了AppCompatActivity{
public static final String INTENTKEY_USERNAME = "IK_USERNAME";
public static final String INTENTKEY_USERID = "IK_USERID";
public static final String INTENTKEY_STRINGUSERID = "IK_USERIDSTRING";
Button mloginbtn;
EditText mEmail,mPassword;
Context mContext;
DatabaseHelper mDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mContext = this;
mloginbtn = this.findViewById(R.id.loginbtn);
mEmail = this.findViewById(R.id.email);
mPassword = this.findViewById(R.id.password);
mDB = new DatabaseHelper(this);
mloginbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handleAuthentication();
}
});
}
private void handleAuthentication() {
if (mDB.authenticateUser(mEmail.getText().toString(),mPassword.getText().toString())) {
User u = mDB.getUser(mEmail.getText().toString(),mPassword.getText().toString());
Intent i = new Intent(mContext,HomeActivity.class);
i.putExtra(INTENTKEY_USERNAME,u.getName());
i.putExtra(INTENTKEY_USERID,u.getLongId());
i.putExtra(INTENTKEY_STRINGUSERID,u.getId());
startActivity(i);
finish();
}
}
家庭活动
为简洁起见,这已用于显示硬币和宝石,它非常基本,并且依赖DatabaseHelper中的方法来完成大部分工作
public class HomeActivity extends AppCompatActivity {
TextView mUserameTextView, mUseridTextView, mCoinsTextView, mGemsTextView;
Button mAdd10Coins, mAdd10Gems,mDone;
User mUser;
long mUserid;
Context mContext;
DatabaseHelper mDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mContext = this;
mDB = new DatabaseHelper(mContext);
mUserameTextView = this.findViewById(R.id.username);
mUseridTextView = this.findViewById(R.id.userid);
mCoinsTextView = this.findViewById(R.id.coins);
mGemsTextView = this.findViewById(R.id.gems);
Intent i = this.getIntent();
mUserid = i.getLongExtra(LoginActivity.INTENTKEY_USERID,-1);
mUser = mDB.getUser(mUserid);
refreshDisplay();
initButtons();
}
private void initButtons() {
mAdd10Coins = this.findViewById(R.id.add10coins);
mAdd10Coins.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDB.adjustCoinsAndOrGems(mUser,10,User.ADJUSTTYPE_ADD,0,User.ADJUSTTYPE_ADD);
mUser = mDB.getUser(mUserid);
refreshDisplay();
}
});
mAdd10Gems = this.findViewById(R.id.add10gems);
mAdd10Gems.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDB.adjustCoinsAndOrGems(mUser,0, User.ADJUSTTYPE_ADD,10,User.ADJUSTTYPE_ADD);
mUser = mDB.getUser(mUserid);
refreshDisplay();
}
});
mDone = this.findViewById(R.id.done);
mDB = new DatabaseHelper(mContext);
mDone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
private void refreshDisplay() {
mUseridTextView.setText(mUser.getId());
mUserameTextView.setText(mUser.getName());
mCoinsTextView.setText(String.valueOf(mUser.getCoins()));
mGemsTextView.setText(String.valueOf(mUser.getGems()));
}
}
我建议只传递userid(它永远不会改变),然后总是从数据库中获取值,也只在数据库中更改它们(然后从数据库中的值重置显示的值)
这样,您就不会有试图处理两组数据的问题,您将依赖于真实数据,即数据库中的数据
工作示例
下面是一些介绍基本知识的代码
当它启动MainActivity时,在您登录时立即启动LoginActivity,然后它将带您进入HomeActivity。这将显示当前用户ID、用户名、硬币(最初为0)和宝石
有两个按钮Add10Coins和Add10gems单击它们将把新值应用到显示更新值的数据库中。如果停止应用程序并重新运行,则登录后的值将保持原样
传递值是明智的,尽管LoginActivity设置了3个Intent额外值,但是HomeActivity只使用了一个(长的用户ID),但是根据显示的值,所有都是可访问的。如果启动了另一个活动,那么您所要做的就是通过Intent传递用户ID
这段代码不是我所说的复杂代码,但我肯定会建议您仔细阅读并试着理解它
user.java
我添加了一些方法,还添加了一些常量,现在是:-
public class User {
public static final int ADJUSTTYPE_ADD = 1;
public static final int ADJUSTTYPE_REPLACE = 2;
public static final int ADJUSTTYPE_MULTIPLY = 3;
public static final int ADJUSTTYPE_DIVIDE = 4;
String id;
String userName;
String email;
String password;
int coins;
int gems;
public User(String id, String userName, String email, String password) {
this.id = id;
this.email = email;
//And so on. Don't mind this
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setName(String userName) {
this.userName = userName;
}
public String getName() {
return this.userName;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setCoins(int coins) {
this.coins = coins;
}
public int getCoins() {
return this.coins;
}
public void setGems(int gems) {
this.gems = gems;
}
public int getGems() {
return this.gems;
}
public long getLongId() {
long id;
try {
id = Long.valueOf(this.id);
} catch (Exception e) {
return -1;
}
return id;
}
}
DatabaseHelper.java
这是从零开始写的,不是基于对代码最严格的检查,它在很大程度上会受到我的样式/使用技术的影响,但不会影响到我申请真正开发的程度
其中是方法adjustCoinsAndOrGems这是用来更新数据库和返回用户中的宝石或硬币的方法(以便返回用户的同步版本,而不是使用此返回使用(我个人更喜欢访问数据库,只要它不是问题)(例如,显著影响绩效)
public class HomeActivity extends AppCompatActivity {
TextView mUserameTextView, mUseridTextView, mCoinsTextView, mGemsTextView;
Button mAdd10Coins, mAdd10Gems,mDone;
User mUser;
long mUserid;
Context mContext;
DatabaseHelper mDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mContext = this;
mDB = new DatabaseHelper(mContext);
mUserameTextView = this.findViewById(R.id.username);
mUseridTextView = this.findViewById(R.id.userid);
mCoinsTextView = this.findViewById(R.id.coins);
mGemsTextView = this.findViewById(R.id.gems);
Intent i = this.getIntent();
mUserid = i.getLongExtra(LoginActivity.INTENTKEY_USERID,-1);
mUser = mDB.getUser(mUserid);
refreshDisplay();
initButtons();
}
private void initButtons() {
mAdd10Coins = this.findViewById(R.id.add10coins);
mAdd10Coins.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDB.adjustCoinsAndOrGems(mUser,10,User.ADJUSTTYPE_ADD,0,User.ADJUSTTYPE_ADD);
mUser = mDB.getUser(mUserid);
refreshDisplay();
}
});
mAdd10Gems = this.findViewById(R.id.add10gems);
mAdd10Gems.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDB.adjustCoinsAndOrGems(mUser,0, User.ADJUSTTYPE_ADD,10,User.ADJUSTTYPE_ADD);
mUser = mDB.getUser(mUserid);
refreshDisplay();
}
});
mDone = this.findViewById(R.id.done);
mDB = new DatabaseHelper(mContext);
mDone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
private void refreshDisplay() {
mUseridTextView.setText(mUser.getId());
mUserameTextView.setText(mUser.getName());
mCoinsTextView.setText(String.valueOf(mUser.getCoins()));
mGemsTextView.setText(String.valueOf(mUser.getGems()));
}
}