【问题标题】:How to check if a user already exists in SQLite database in Android?如何检查用户是否已存在于 Android 的 SQLite 数据库中?
【发布时间】:2017-01-11 04:50:54
【问题描述】:

我正在尝试创建一个基于 SQLite 数据库执行基本注册和登录功能的应用程序。

如何检查用户是否已经存在?我在这里尝试的是,如果我们尝试添加重复的用户,它应该发送一条消息“用户已经退出”

我的代码:

final SQLiteDatabase database = this.openOrCreateDatabase("Users", MODE_PRIVATE, null);
database.execSQL("CREATE TABLE IF NOT EXISTS users (uname VARCHAR UNIQUE, pword VARCHAR UNIQUE)");
//database.execSQL("CREATE UNIQUE INDEX idx_something ON users (uname, pword)");
signUp.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        String username1 = userName.getText().toString();
        String  password1 = passWord.getText().toString();

        if (username1 != null && !username1.trim().isEmpty() && password1 != null && !password1.trim().isEmpty()) {
        try {
            database.execSQL("INSERT OR REPLACE INTO users(uname, pword) VALUES('"+username1+"', '"+password1+"')");
        } catch (Exception e) {
            e.printStackTrace();
        }

        Toast.makeText(getApplicationContext(), passWord.getText().toString(), Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "Please enter details", Toast.LENGTH_LONG).show();
        }
    }
});

logIn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MainActivity.this, secondscreen.class);
        try {
            Cursor c = database.rawQuery("SELECT * FROM users", null);
            int unameIndex = c.getColumnIndex("uname");
            int pwordIndex = c.getColumnIndex("pword");
            c.moveToFirst();
            while (c != null) {
                 {
                    String savedUname = c.getString(unameIndex);
                String savedPword = c.getString(pwordIndex);
                     Log.i("Table Content:",savedPword.toString()+savedUname.toString());

              if (savedUname.equals(userName.getText().toString())) {

                    if (savedPword.equals(passWord.getText().toString())) {

                        intent.setAction(Intent.ACTION_VIEW);
                        startActivity(intent);
                    } else {
                        Toast.makeText(getApplicationContext(), " Incorrect username or password ", Toast.LENGTH_LONG).show();
                    }
                } 
            }
                c.moveToNext();
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
});

【问题讨论】:

标签: android sqlite


【解决方案1】:

你可以这样做。

        logIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
    String username1 = userName.getText().toString().trim();
            Intent intent = new Intent(MainActivity.this, secondscreen.class);
            try {
                Cursor c = database.rawQuery("SELECT * FROM users where uname= "+username1, null);
    if(c.getCount()>0)
    {
    Toast.makeText(getApplicationContext(), "USER ALREADY EXITS", Toast.LENGTH_LONG).show();
    }
}catch(Exception e)
{
   e.printStackTrace();
}
}
});

【讨论】:

    【解决方案2】:

    在您的表定义中添加一个自增 ID,例如:

    CREATE TABLE IF NOT EXISTS users (id INTEGER primary key AUTOINCREMENT, uname VARCHAR UNIQUE, pword VARCHAR)
    

    每当向表中插入新记录时,id 字段将自动增加 1,并使 ID 字段成为 primary key 确保表中的每一行数据都是唯一的。

    请记住只将uname设为UNIQUE,这将确保所有注册用户都拥有唯一的用户名。

    我想指出,在检查登录时不检索所有用户,例如

    SELECT * FROM users
    

    检索用户如下:

    SELECT * FROM users WHERE uname = "+uname_login_edittext+"";
    

    从登录表单的username 字段中获取username 文本。

    由于您表中的所有用户名都是唯一的,因此它只会检索 1 条记录或什么都不检索,您可以使用它来检查是否有注册用户并继续登录。

    编辑:

    试试下面的登录代码,像我做的那样把savedUnamesavedPword字符串变成全局变量。

    String inputUname = userName.getText().toString(); //get username from login form
    String savedUname = null;
    String savedPword = null;
    
        Cursor c = database.rawQuery("SELECT * FROM users WHERE uname = "+inputUname+"", null);
                    int unameIndex = c.getColumnIndex("uname");
                    int pwordIndex = c.getColumnIndex("pword");
                    c.moveToFirst();
                    if(c != null) {
    
                        savedUname = c.getString(unameIndex);
                        savedPword = c.getString(pwordIndex);
    
    
                    {
    
                      if (savedUname.equals(userName.getText().toString())) {
    
                            if (savedPword.equals(passWord.getText().toString())) {
    
                                intent.setAction(Intent.ACTION_VIEW);
                                startActivity(intent);
    
                            } else {
                                Toast.makeText(getApplicationContext(), " Incorrect username or password ", Toast.LENGTH_LONG).show();
                            }
                        } 
    

    【讨论】:

    • 感谢您的回复@RamithDR,但它也无法正常工作,此外我在日志中收到此错误:'(表用户没有名为 id 的列(代码 1):,编译时:INSERT INTO users(id, uname, pword) VALUES('hhhh', '1234'))'
    • @JahnaviJaanu 因为你使用的是旧数据库,从测试设备上卸载应用程序并重新测试。
    • 感谢@RamithDR 设备重启后它的工作。但是 SELECT * users WHERE 不起作用,可以写清楚以及如何实现以检查现有用户
    • 非常感谢@RamithDR
    【解决方案3】:

    试试这个

    database.execSQL("REPLACE INTO users(uname, pword) VALUES('"+username1+"', '"+password1+"')");
    

    取消注释您的索引创建查询,卸载您的应用并重试

    如果这不起作用意味着值可能必须有一些空间或其他东西

    如果这不起作用,那么您可以简单地使用嵌套查询,例如 this

    【讨论】:

    • 谢谢@Pavneet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多