Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数据库加载用户数据并将其传递到intent extras的正确方法是什么_Java_Android_Database_Sqlite - Fatal编程技术网

Java 从数据库加载用户数据并将其传递到intent extras的正确方法是什么

Java 从数据库加载用户数据并将其传递到intent extras的正确方法是什么,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在做的项目允许用户注册和登录,所有的工作都很完美,直到我发现代码有问题。它不算作错误,因为编译器认为它不是错误。这只是一个bug,或者人们管它叫什么。下面是发生的事情。用户登录到其帐户后,数据库将其数据传输到intent extras。然后在接下来的活动中,用户名、硬币和宝石会出现在页面顶部,以便用户知道他们还剩下多少硬币。出于测试目的,我添加了添加硬币和减少硬币按钮。尽管如此,代码仍然可以完美地工作。但在用户注销并重新登录后,硬币将回到原始金额。我知道在User.java类中给coin变量

我正在做的项目允许用户注册和登录,所有的工作都很完美,直到我发现代码有问题。它不算作错误,因为编译器认为它不是错误。这只是一个bug,或者人们管它叫什么。下面是发生的事情。用户登录到其帐户后,数据库将其数据传输到
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)和宝石

有两个按钮Add10CoinsAdd10gems单击它们将把新值应用到显示更新值的数据库。如果您停止应用程序并重新运行,请登录,然后值将保持原样

以智能方式传递值,尽管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)和宝石

有两个按钮Add10CoinsAdd10gems单击它们将把新值应用到显示更新值的数据库中。如果停止应用程序并重新运行,则登录后的值将保持原样

传递值是明智的,尽管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()));
    }
}