Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
如何检查Android中的SQLite数据库中是否已经存在用户?_Android_Sqlite - Fatal编程技术网

如何检查Android中的SQLite数据库中是否已经存在用户?

如何检查Android中的SQLite数据库中是否已经存在用户?,android,sqlite,Android,Sqlite,我正在尝试创建一个应用程序,它基于SQLite数据库执行基本的注册和登录功能 如何检查用户是否已经存在?我在这里尝试的是,如果我们试图添加重复用户,它应该发送一条消息“用户已经退出” 我的代码: final SQLiteDatabase database = this.openOrCreateDatabase("Users", MODE_PRIVATE, null); database.execSQL("CREATE TABLE IF NOT EXISTS users (uname VARCHA

我正在尝试创建一个应用程序,它基于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();
        }
    }
});

将自动增量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
文本

由于your表中的所有用户名都是唯一的,因此它只能检索1条记录或不检索任何记录,您可以使用该记录检查是否有注册用户,然后继续登录

编辑:

尝试下面的登录代码,将
savedUname
savedPword
字符串设置为全局变量,就像我所做的那样

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

将自动增量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
文本

由于your表中的所有用户名都是唯一的,因此它只能检索1条记录或不检索任何记录,您可以使用该记录检查是否有注册用户,然后继续登录

编辑:

尝试下面的登录代码,将
savedUname
savedPword
字符串设置为全局变量,就像我所做的那样

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();
                        }
                    } 
试试这个

database.execSQL("REPLACE INTO users(uname, pword) VALUES('"+username1+"', '"+password1+"')");
取消对索引创建查询的注释,卸载应用程序并重试

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

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

database.execSQL("REPLACE INTO users(uname, pword) VALUES('"+username1+"', '"+password1+"')");
取消对索引创建查询的注释,卸载应用程序并重试

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

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

您可以这样做

        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();
}
}
});
你可以这样做

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

可能重复查看此链接感谢您的回复@VishalThakkar,但它在我的情况下不起作用,请查看我的代码,然后将varchar替换为文本。varchar不是sqlite类型查看此是,但是不起作用@VishalThakkar可能是重复的请查看此链接谢谢您的回复@VishalThakkar但它在我的情况下不起作用,请您看看我的代码,然后将varchar替换为文本。varchar不是sqlite类型请看这个是的,但不起作用@VishalThakkarThanks用于您的回复@RamithDR,但它也不起作用,此外,我在日志中发现了这个错误:'(表用户没有名为id(代码1)的列),编译时:INSERT-INTO-users(id,uname,pword)value('hhh','1234'))@JahnaviJaanu这是因为您使用的是旧数据库,请从测试设备卸载应用程序,然后再次测试。感谢@RamithDR在设备重新启动后的工作。但是SELECT*用户在不工作的地方,可以清楚地编写它,以及如何实现它来检查现有用户谢谢您的回复@RamithDR,但它也不工作,而且我在日志中得到了这个错误:'(表用户没有名为id(代码1)的列),编译时:INSERT INTO users(id,uname,pword)值('hhh','1234'))“@JahnaviJaanu这是因为您使用的是旧数据库,请从测试设备中卸载应用程序,然后再次测试。感谢@RamithDR在设备重新启动后仍能正常工作。但请选择*不工作的用户,可以清楚地写下它,以及如何实现它来检查现有用户谢谢@RamithDRThank you@pavneethank you@Pavneet