【问题标题】:How to avoid redundancy in database?如何避免数据库冗余?
【发布时间】:2015-05-27 12:41:07
【问题描述】:

我创建了一个用户注册和登录应用。我做了以下事情。

MainActivity.java

 si=(Button)findViewById(R.id.button);
    su=(Button)findViewById(R.id.button2);
    si.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent1=new Intent(MainActivity.this,Login.class);
            startActivity(intent1);
        }
    });
    su.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent2=new Intent(MainActivity.this,Signup.class);
            startActivity(intent2);
        }
    });

Signup.java

databaseAdapter=new DatabaseAdapter(this);
    databaseAdapter=databaseAdapter.open();

    un=(EditText)findViewById(R.id.editText);
    pwd=(EditText)findViewById(R.id.editText2);
    cnfpwd=(EditText)findViewById(R.id.editText3);
    signu=(Button)findViewById(R.id.button3);

    signu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String Uname=un.getText().toString();
            String passw=pwd.getText().toString();
            String cnfpassw=cnfpwd.getText().toString();

            if (Uname.equals("")||passw.equals("")||cnfpassw.equals("")){
                //Toast.makeText(getApplicationContext(),"Please Fill all the Fields",Toast.LENGTH_SHORT).show();
                show("Error","Please fill all the fields");
                return;
            }

            if(!passw.equals(cnfpassw)){
                //Toast.makeText(getApplicationContext(),"Password does not match",Toast.LENGTH_SHORT).show();
                show("Error","Password does not match");
                pwd.setText("");
                cnfpwd.setText("");
                return;
            } else {
                databaseAdapter.insertEntry(Uname,passw);
                //Toast.makeText(getApplicationContext(),"Account Created Successfully",Toast.LENGTH_LONG).show();
                show("Success", "Account Created Successfully");
                //finish();
                un.setText("");
                pwd.setText("");
                cnfpwd.setText("");
            }
        }
    });
}

private void show(String title, String message) {
    AlertDialog.Builder builder=new AlertDialog.Builder(Signup.this);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.show();
}

Login.java

   databaseAdapter=new DatabaseAdapter(this);
    databaseAdapter=databaseAdapter.open();

    UN=(EditText)findViewById(R.id.editText4);
    PWD=(EditText)findViewById(R.id.editText5);
    si=(Button)findViewById(R.id.button4);

    si.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String UserName=UN.getText().toString();
            String Password=PWD.getText().toString();

            String storedPassword=databaseAdapter.getSingleEntry(UserName);
            //String storesUserName=databaseAdapter.getUserName(Password);

            if (UserName.equals("")||Password.equals("")){
                show("Error","Please fill all Fields");
                return;
            }
            if (Password.equals(storedPassword)){
                //Toast.makeText(Login.this,"Login Successful",Toast.LENGTH_SHORT).show();
                show("Success","Login Successful");
                String storedUserName=databaseAdapter.getUserDetails(Password);
                Toast.makeText(getApplicationContext(),storedUserName,Toast.LENGTH_SHORT).show();
                Bundle bundle=new Bundle();
                bundle.putString("number",storedUserName);
                Intent intent2=new Intent(Login.this,Inbox.class);
                intent2.putExtras(bundle);
                startActivity(intent2);
            } else {
                //Toast.makeText(getApplicationContext(),"Username or Password is incorrect",Toast.LENGTH_SHORT).show();
                show("Error","Username or Password is incorrect");
                UN.setText("");
                PWD.setText("");
            }
        }
    });
}

private void show(String title, String message) {
    AlertDialog.Builder builder=new AlertDialog.Builder(Login.this);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.show();
}

现在我可以从数据库注册和登录。但是Database 允许冗余。即,它允许相同的值任意多次。我想避免这种情况,以便注册唯一的用户名。有什么解决办法吗?

【问题讨论】:

  • 在插入数据库之前检查值是否存在
  • 检查的条件是什么?请。我不知道。
  • 这不是冗余而是唯一性。
  • 为您的用户名+密码列组合添加唯一约束
  • 是的,谢谢

标签: android database sqlite redundancy


【解决方案1】:

我在这里只是给您一个想法,它是我在项目中使用的代码示例,您可以按照自己的方式更改它,这里是您如何查看数据是否已经存在的方法。如果您传递的标题数据在数据库中,则此方法将返回true。

String SELECT_ALL_BY_TITLE = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_TITLE + "=? ;";

 public boolean ifAlreadyExists(String title) {

    if (database != null && database.isOpen()) {
        Cursor cursor = database.rawQuery(SELECT_ALL_BY_TITLE, new String[] { title});
        if (cursor != null && cursor.getCount() > 0) {
            cursor.close();
            return true;
        } else {
            cursor.close();
            return false;
        }
    }
    Log.e(TAG, "Database not open");
    return false;
}

希望对你有帮助

【讨论】:

  • @PraveenKumar 有帮助吗?
【解决方案2】:
    public boolean isUserExists(String username) {
    boolean isdataAvail = false;
    SQLiteDatabase db = null;
    Cursor cursor = null;

        String query = "SELECT * FROM <table_name> WHERE user_name = "+ username;
        db = YourDbHelper.getInstance().getReadableDatabase();
        if(db.isOpen())
        {
            cursor = db.rawQuery(query, null);
            try {
                if( cursor.getCount() > 0){
                    isdataAvail = true;
                }

            } catch (Exception e) {
            } finally {
                if (db != null) {
                    if (db.isOpen()) {
                        db.close();
                        cursor.close();
                    }
                }
            }
        }
    return isdataAvail;
}

如果数据可用,此方法返回 true,则在 DB 中找到具有给定名称的记录。

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2015-11-23
    • 2018-12-17
    • 2011-06-16
    • 2017-08-10
    相关资源
    最近更新 更多