亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是從數據庫加載用戶數據并將其傳遞給 Intent Extras 的正確方法

什么是從數據庫加載用戶數據并將其傳遞給 Intent Extras 的正確方法

一只名叫tom的貓 2022-04-28 17:18:07
我正在進行的項目允許用戶注冊和登錄,并且一切正常,直到我發現代碼有問題。它不算作錯誤,因為編譯器不認為它是錯誤。它只是一個錯誤或人們稱之為的任何東西。所以這就是發生的事情。用戶登錄到他們的帳戶,數據庫將他們的數據傳輸到intent extras. 然后在接下來的活動中,用戶名、硬幣和寶石出現在頁面頂部,以便用戶知道他們還剩下多少硬幣。出于測試目的,我添加了添加硬幣和減少硬幣按鈕。盡管如此,代碼仍然可以完美運行。但用戶注銷并重新登錄后,coins恢復到原來的金額。我知道將值放在 coin 變量上引起的問題User.java班級。仍然在登錄時,我將用戶的硬幣和寶石的默認值放在了額外的意圖中。在用戶登錄時,我只是找不到如何將數據庫中的值放入意圖附加項的方法。所以這里是登錄活動的代碼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");                }            }        }    });老實說,我的大腦缺乏邏輯。這就是我來這里的原因,看看我的代碼是否有意義。如果你不明白我的意思,請問我哪些部分,請不要立即標記我的問題。我的英語真的很差,相信我。
查看完整描述

1 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

我建議只傳遞用戶 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","[email protected]","password");

        mDB.addUser("Mary","[email protected]","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;


@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()));

    }

}



查看完整回答
反對 回復 2022-04-28
  • 1 回答
  • 0 關注
  • 390 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號