森林海
我建议只传递用户 ID(它永远不应该改变),然后总是从数据库中获取值硬币等,并且也只在数据库中更改它们(然后从数据库中的值重置显示的值)。然后,您将不会遇到尝试处理两组数据的问题,然后您将依赖真实数据,即数据库中的数据。工作示例以下是一些基本的代码。当它启动 MainActivity 时,在您登录时立即启动 LoginActivity,然后将您带到 HomeActivity。这将显示当前的用户 ID、用户名、硬币(最初为 0)和宝石。有 2 个按钮Add10Coins和Add10gems单击它们会将新值应用于显示更新值的数据库。如果您停止应用程序并重新运行,登录然后值将保持原样。明智地传递值,虽然 LoginActivity 设置了 3 个 Intent Extra 值,但 HomeActivity 只使用了一个(用户 ID 为 long),但根据显示的值,所有值都是可访问的。如果启动了另一个活动,那么您所要做的就是通过意图传递用户 ID。代码不是我所说的复杂,但我肯定会建议仔细阅读并尝试理解它。用户.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; }}数据库助手.java这是基于不是对您的代码进行最严格的检查而从头开始编写的,它将在很大程度上受到我的样式/使用技术的影响,但不会影响到我申请实际开发的程度。其中是方法adjustCoinsAndOrGems这是用于更新数据库中以及返回的用户中的宝石或硬币的方法(以便返回用户的同步版本,而不是使用返回的使用(我个人更喜欢只要不是问题就访问数据库(例如显着影响性能)))public class DatabaseHelper extends SQLiteOpenHelper { public static final String DBNAME = "mygame.db"; public static final int DBVERSION = 1; public static final String TBL_USER = "user"; public static final String COL_USER_ID = BaseColumns._ID; public static final String COL_USER_NAME = "user_name"; public static final String COL_USER_EMAIL = "user_email"; public static final String COL_USER_PASWWORD = "user_password"; public static final String COL_USER_COINS = "user_coins"; public static final String COL_USER_GEMS = "user_gems"; public static final String TBL_PLAYER = "player"; public static final String COL_PLYAER_ID = BaseColumns._ID; public static final String COL_PLAYER_OWNINGUSER = "player_owninguser"; public static final String COL_PLAYER_NAME = "player_name"; //...... other columns SQLiteDatabase mDB; public DatabaseHelper(Context context) { super(context, DBNAME, null, DBVERSION); mDB = this.getWritableDatabase(); } @Override public void onCreate(SQLiteDatabase db) { String crt_tbl_user = "CREATE TABLE IF NOT EXISTS " + TBL_USER + "(" + COL_USER_ID + " INTEGER PRIMARY KEY," + COL_USER_NAME + " TEXT NOT NULL UNIQUE," + COL_USER_EMAIL + " TEXT NOT NULL UNIQUE," + COL_USER_PASWWORD + " TEXT NOT NULL," + COL_USER_COINS + " INTEGER," + COL_USER_GEMS + " INTEGER" + ")"; String crt_tbl_player = "CREATE TABLE IF NOT EXISTS " + TBL_PLAYER + "(" + COL_PLYAER_ID + " INTEGER PRIMARY KEY," + COL_PLAYER_NAME + " TEXT NOT NULL," + COL_PLAYER_OWNINGUSER + " INTEGER REFERENCES " + TBL_USER + "(" + COL_USER_ID + ")" + ")"; db.execSQL(crt_tbl_user); db.execSQL(crt_tbl_player); } @Override public void onUpgrade(SQLiteDatabase db, int i, int i1) { } /* Note core add but not intended to be used directly Note this assumes that checks are done to ensure that name, email and password have been provided */ private long addUser(Long id, String name, String email, String password, int coins, int gems) { ContentValues cv = new ContentValues(); if (id > 0) { cv.put(COL_USER_ID,id); } if (name.length() > 0) { cv.put(COL_USER_NAME,name); } if (email.length() > 0 ) { cv.put(COL_USER_EMAIL,email); } if (password.length() > 0) { cv.put(COL_USER_PASWWORD,password); } cv.put(COL_USER_COINS,coins); cv.put(COL_USER_GEMS,gems); if (cv.size() < 1) return -1; //<<<<<<<<<< return if nothing to add return mDB.insert(TBL_USER,null,cv); } /* For add with just name, email and password (normal usage) */ public long addUser(String name, String email, String password) { return this.addUser(-1L,name,email,password,0,0); } /* For adding a user setting the coins and gems (special usage) */ public long addUserSettingCoinsAndGems(String name, String email, String password, int coins, int gems) { return this.addUser(-1L,name,email,password,coins,gems); } public User getUser(long id) { User rv = new User("-1","",",",""); // Invalid user String whereclause = COL_USER_ID + "=?"; String[] whereargs = new String[]{String.valueOf(id)}; Cursor csr = mDB.query(TBL_USER,null,whereclause,whereargs,null,null,null); if (csr.moveToFirst()) { rv.setId(String.valueOf(id)); rv.setName(csr.getString(csr.getColumnIndex(COL_USER_NAME))); rv.setEmail(csr.getString(csr.getColumnIndex(COL_USER_EMAIL))); rv.setPassword(csr.getString(csr.getColumnIndex(COL_USER_PASWWORD))); rv.setCoins(csr.getInt(csr.getColumnIndex(COL_USER_COINS))); rv.setGems(csr.getInt(csr.getColumnIndex(COL_USER_GEMS))); } csr.close(); return rv; } public User getUser(String userid) { String whereclause = COL_USER_ID + "=?"; User rv = new User("-1","",",",""); // Invalid user long id; try { id = Long.valueOf(userid); } catch (Exception e) { return rv; } String[] whereargs = new String[]{String.valueOf(id)}; Cursor csr = mDB.query(TBL_USER,null,whereclause,whereargs,null,null,null); if (csr.moveToFirst()) { rv.setId(String.valueOf(id)); rv.setName(csr.getString(csr.getColumnIndex(COL_USER_NAME))); rv.setEmail(csr.getString(csr.getColumnIndex(COL_USER_EMAIL))); rv.setPassword(csr.getString(csr.getColumnIndex(COL_USER_PASWWORD))); rv.setCoins(csr.getInt(csr.getColumnIndex(COL_USER_COINS))); rv.setGems(csr.getInt(csr.getColumnIndex(COL_USER_GEMS))); } csr.close(); return rv; } public User getUser(String email, String password) { User rv = new User("-1","","",""); String whereclause = COL_USER_EMAIL + "=? AND " + COL_USER_PASWWORD + "=?"; String[] whereargs = new String[]{email,password}; Cursor csr = mDB.query(TBL_USER,null,whereclause,whereargs,null,null,null); if (csr.moveToFirst()) { rv.setId( String.valueOf(csr.getLong(csr.getColumnIndex(COL_USER_ID)))); rv.setName(csr.getString(csr.getColumnIndex(COL_USER_NAME))); rv.setEmail(csr.getString(csr.getColumnIndex(COL_USER_EMAIL))); rv.setPassword(csr.getString(csr.getColumnIndex(COL_USER_PASWWORD))); rv.setCoins(csr.getInt(csr.getColumnIndex(COL_USER_COINS))); rv.setGems(csr.getInt(csr.getColumnIndex(COL_USER_GEMS))); } csr.close(); return rv; } public User adjustCoinsAndOrGems(User u, int coins, int coin_adjustmode, int gems, int gem_adjustmode) { ContentValues cv = new ContentValues(); User rv; User user_fromDB = getUser(u.getId()); if (user_fromDB.id.equals("-1")) return u; // User not found so return switch (coin_adjustmode) { case User.ADJUSTTYPE_REPLACE: cv.put(COL_USER_COINS,coins); break; case User.ADJUSTTYPE_ADD: if (coins != 0) { cv.put(COL_USER_COINS,user_fromDB.getCoins() + coins); } break; case User.ADJUSTTYPE_MULTIPLY: if (coins > 0) { cv.put(COL_USER_COINS,user_fromDB.getCoins() * coins); } break; case User.ADJUSTTYPE_DIVIDE: if (coins > 0) { cv.put(COL_USER_COINS,user_fromDB.getCoins() / coins); } break; } switch (gem_adjustmode) { case User.ADJUSTTYPE_REPLACE: cv.put(COL_USER_GEMS,gems); break; case User.ADJUSTTYPE_ADD: if (gems != 0) { cv.put(COL_USER_GEMS,user_fromDB.getGems() + gems); } break; case User.ADJUSTTYPE_MULTIPLY: if (gems > 0) { cv.put(COL_USER_GEMS,user_fromDB.getGems() * gems); } break; case User.ADJUSTTYPE_DIVIDE: if (gems > 0) { cv.put(COL_USER_GEMS,user_fromDB.getGems() / gems); } break; } if (cv.size() < 1) return u; String whereclause = COL_USER_ID + "=?"; String[] whereargs = new String[]{u.getId()}; mDB.update(TBL_USER,cv,whereclause,whereargs); return getUser(user_fromDB.getId()); } public boolean authenticateUser(String email, String password) { User u = getUser(email,password); return (u.getLongId() > 0); }}MainActivity.java启动 LoginActivity 并最终返回时什么都不做的非常简单的活动(因此您不妨杀死该应用程序)。public class MainActivity extends AppCompatActivity { TextView mMessage; DatabaseHelper mDB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMessage = this.findViewById(R.id.message); mDB = new DatabaseHelper(this); addSomeTestingUsers(); // Immediately start Login Activity Intent i = new Intent(MainActivity.this,LoginActivity.class); startActivity(i); } @Override protected void onResume() { super.onResume(); mMessage.setText("Welcome back"); } private void addSomeTestingUsers() { if (DatabaseUtils.queryNumEntries(mDB.getWritableDatabase(),DatabaseHelper.TBL_USER) > 0) return; mDB.addUser("Fred","fred@fredmal.com","password"); mDB.addUser("Mary","mary@mary.email.com","password"); }}登录活动这是非常简单的说明,就目前而言,您必须登录,并且 2 个用户的电子邮件和密码已编码在 MainActivity 中。正确供应后,HomeActivivty 将启动:-公共类 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;@Overrideprotected 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())); }}