如何匹配的SQLite在不同的表值?

问题描述 投票:0回答:1

我试图创建一个数据库的功能,这将有助于我与我的学生证。 table_userinfo具有存储在它已经学号,姓名,当然值。 table_users为空接受来自用户的电子邮件,学生ID和密码。我想创造一个存储在table_userinfo可以只注册学生证的功能,否则显示一个错误,学生不存在。用户输入学号也应检索table_userinfo相应的课程和名称。也就是我的权利或不插入值的代码。因为我以前尝试过了,我在第一次插入值线有一个运行错误。

//Code for table creation
 public static final String SQL_TABLE_USERS = " CREATE TABLE " +    
TABLE_USERS
         + " ( "
         + KEY_ID + " INTEGER PRIMARY KEY, "
         + KEY_EMAIL + " TEXT, "
         + KEY_SID + " INTEGER, "
         + KEY_PASSWORD + " TEXT"
         + " ) ";

 //SQL for creating user info table
 public static final String SQL_TABLE_USERINFO = " CREATE TABLE "    
+ TABLE_USERINFO
         + " ( "
         + KEY_ID + "INTEGER PRIMARY KEY, "
         + KEY_SID + " INTEGER, "
         + KEY_NAME + "TEXT, "
         + KEY_COURSE + " TEXT "
         + " ) ";


 public SqliteHelper(Context context) {
     super(context, DATABASE_NAME, null, DATABASE_VERSION);
 }

 @Override
 public void onCreate(SQLiteDatabase sqLiteDatabase) {
     //Create Table when oncreate gets called
     sqLiteDatabase.execSQL(SQL_TABLE_USERS);
     sqLiteDatabase.execSQL(SQL_TABLE_USERINFO);
     sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO 
   VALUES('01','45207160010','Mary James','TYBSCIT')");
     sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO 
  VALUES('02','45207160020','Amelia John','FYBCOM')");

更新: - 我有检查现在两个功能,如果邮件存在,如果学生在我的SQLite的代码存在。但是,当我从注册页面调用的函数,应用程序崩溃和日志说,错误是在函数被点击注册按钮时。我分享我的功能和注册页面的代码。请告诉我,如果我做一些错误。我已经尝试不同的组合,用于循环啊,我的注册页面。不工作。但是,如果只放了电子邮件存在的功能,它的工作原理呢。

SQLITE代码

 public boolean ifUserInCourse(String sid) {
        boolean rv = false;
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor csr = db.query(TABLE_USERINFO,null, whereclause, whereargs,null,null,null);
        if (csr.getCount() > 0) rv = true;
        csr.close();
        return rv;
    }


    public boolean isEmailExists(String email) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_USERS,// Selecting Table
                new String[]{KEY_ID, KEY_EMAIL, KEY_SID, KEY_PASSWORD},//Selecting columns want to query
                KEY_EMAIL + "=?",
                new String[]{email},//Where clause
                null, null, null);

        if (cursor != null && cursor.moveToFirst()&& cursor.getCount()>0) {
            //if cursor has value then in user database there is user associated with this given email so return true
            return true;
        }

        //if email does not exist return false
        return false;
    }

注册码

buttonRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (validate()) {
                    String Email = editTextEmail.getText().toString();
                    String SID = editTextSID.getText().toString();
                    String Password = editTextPassword.getText().toString();
                    progressBar.setVisibility(View.VISIBLE);

                    //Check in the database is there any user associated with  this email

                        if (!sqliteHelper.ifUserInCourse(SID) && !sqliteHelper.isEmailExists(Email)) {

                            sqliteHelper.addUser(new User(null, Email, SID, Password));
                            Snackbar.make(buttonRegister, "User created successfully! Please Login ", Snackbar.LENGTH_LONG).show();
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    finish();
                                }
                            }, Snackbar.LENGTH_LONG);


                        } else {
                            if(sqliteHelper.isEmailExists(Email)) {

                                Snackbar.make(buttonRegister, "Email already exists ", Snackbar.LENGTH_LONG).show();


                            } else {

                                Snackbar.make(buttonRegister, "User doesn't exists ", Snackbar.LENGTH_LONG).show();
                            }

                        }

                    progressBar.setVisibility(View.GONE);


                }
            }
        });
android database android-sqlite sqliteopenhelper
1个回答
0
投票

Issue 1 as per :-

也就是我的权利或不插入值的代码。因为我以前尝试过了,我在第一次插入值线有一个运行错误。

除非你有public static final String TABLE_USERINFO = "TABLE_USERINFO";其考虑的近重复的问题是,你不那么

    sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO VALUES('01','45207160010','Mary James','TYBSCIT')");
    sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO VALUES('02','45207160020','Amelia John','FYBCOM')");

会导致异常,由于找不到表。

我相信你,而不是应该使用: -

    sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('01','45207160010','Mary James','TYBSCIT')");
    sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('02','45207160020','Amelia John','FYBCOM')");
  • 即,用户可变TABLE_USERINFO而不是硬编码值TABLE_USERINFO。

此外,您会遇到问题,因为你已经+ KEY_NAME + "TEXT, "代替+ KEY_NAME + " TEXT, "(空间略)。

Issue 2 as per :-

我想创造一个存储在table_userinfo可以只注册学生证的功能,否则显示一个错误,学生不存在。用户输入学号也应检索table_userinfo相应的课程和名称。

下面SqliteHelper.java将有助于上述(考虑到了类似的问题以前提供的答案您的回复)

public class SqliteHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "mydb";
    public static final int DATABASE_VERSION = 1;

    public static final String TABLE_USERS = "user_reg";
    public static final String TABLE_USERINFO = "user_info";

    public static final String KEY_ID = BaseColumns._ID;
    public static final String KEY_EMAIL = "email";
    public static final String KEY_SID = "sid";
    public static final String KEY_PASSWORD = "password";
    public static final String KEY_NAME = "name";
    public static final String KEY_COURSE = "coures";



    public static final String SQL_TABLE_USERS = " CREATE TABLE " +
            TABLE_USERS
            + " ( "
            + KEY_ID + " INTEGER PRIMARY KEY, "
            + KEY_EMAIL + " TEXT, "
            + KEY_SID + " INTEGER, "
            + KEY_PASSWORD + " TEXT"
            + " ) ";

    //SQL for creating user info table
    public static final String SQL_TABLE_USERINFO = " CREATE TABLE "
            + TABLE_USERINFO
            + " ( "
            + KEY_ID + "INTEGER PRIMARY KEY, "
            + KEY_SID + " INTEGER, "
            + KEY_NAME + " TEXT, "
            + KEY_COURSE + " TEXT "
            + " ) ";

    public SqliteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //Create Table when oncreate gets called
        sqLiteDatabase.execSQL(SQL_TABLE_USERS);
        sqLiteDatabase.execSQL(SQL_TABLE_USERINFO);
        sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('01','45207160010','Mary James','TYBSCIT')");
        sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('02','45207160020','Amelia John','FYBCOM')");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long registerUser(String sid, String email, String password) {
        if (email.length() < 1) return -9999;
        if (password.length() < 1) return -9998;
        if (sid.length() < 1) return -9997;
        if (ifUserRegistered(sid)) return -99; // Check if user is already registered
        if (!ifUserInCourse(sid)) return  -999;  // Check if user is enrolled in a course perhpas optional
        ContentValues cv = new ContentValues();
        cv.put(KEY_SID,sid);
        cv.put(KEY_EMAIL,email);
        cv.put(KEY_PASSWORD,password);
        SQLiteDatabase db = this.getWritableDatabase();
        return db.insert(TABLE_USERS,null,cv);
    }

    public boolean ifUserRegistered(String sid) {
        boolean rv = false;
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_USERS,null,whereclause,whereargs,null,null,null);
        if (csr.getCount() > 0) rv = true;
        csr.close();
        return rv;
    }

    public boolean ifUserInCourse(String sid) {
        boolean rv = false;
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_USERINFO,null,whereclause,whereargs,null,null,null);
        if (csr.getCount() > 0) rv = true;
        csr.close();
        return rv;
    }

    public String getUserNameFromSID(String sid) {
        String rv = "";
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_USERINFO,null,whereclause,whereargs,null,null,null);
        if (csr.moveToFirst()) {
            rv = csr.getString(csr.getColumnIndex(KEY_NAME));
        }
        csr.close();
        return rv;
    }

    public String getUserCourseFromSID(String sid) {
        String rv = "";
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_USERINFO,null,whereclause,whereargs,null,null,null);
        if (csr.moveToFirst()) {
            rv = csr.getString(csr.getColumnIndex(KEY_COURSE));
        }
        csr.close();
        return rv;
    }
}

Testing

以上是使用在活动下面的代码进行测试: -

public class MainActivity extends AppCompatActivity {

    SqliteHelper mSQLHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSQLHlpr = new SqliteHelper(this);
        long result1 = mSQLHlpr.registerUser("010101010101010101","[email protected]","1234567890");
        long result2 = mSQLHlpr.registerUser("45207160010","[email protected]","1234567890");
        long result3 = mSQLHlpr.registerUser("45207160010","[email protected]","1234567890");


        Log.d(
                "RESULTS",
                "\tFirst attempt returned " + String.valueOf(result1) + " " + String.valueOf((result1 > 0)) +
                        "\n\tSecond attempt returned " + String.valueOf(result2) + " " + String.valueOf(result2 > 0) +
                        "\n\tThird attempt returned " + String.valueOf(result3) + " " + String.valueOf(result3 > 0)
        );

        String testsid = "45207160010";

        Log.d(
                "USERBYSID",
                "SID " + testsid + " " +
                        "Has a name of " + mSQLHlpr.getUserNameFromSID(testsid) +
                        " and a Course of " + mSQLHlpr.getUserNameFromSID(testsid)
        );
    }
}
  • 注意使用上述用于测试目的,不用于实际应用的效果也那么也许会造成混乱,由于已经存在的行。

Result

上述产生了以下相关的输出: -

2019-02-05 12:38:08.684 21533-21533/? D/RESULTS:    First attempt returned -999 false
        Second attempt returned 1 true
        Third attempt returned -99 false
2019-02-05 12:38:08.686 21533-21533/? D/USERBYSID: SID 45207160010 Has a name of Mary James and a Course of Mary James
  • -999是用于SID代码不存在
  • 1为正表示该行被成功地插入,因此,所有的测试通过。
  • -99为已被注册的SID码。
© www.soinside.com 2019 - 2024. All rights reserved.