sql >> データベース >  >> RDS >> SQLite

2つの異なるテーブルの要素で更新/削除する方法SQLite

    少なくとも1回の変更では、一度に複数のテーブルを更新する必要はありません。生徒の名前が変更された(生徒のテーブルが変更されます)、または成績が変更されたと言います(生徒のそれぞれの成績エントリを変更します)。

    したがって、生徒の詳細(名または姓、あるいはその両方)を更新する方法と、成績を変更する方法(どちらかまたは両方)が最適だと思います。

    削除に関しては、これを成績表と生徒表から順番に削除するか、またはその逆を行うことができます。

    そのため、次のコードにはメソッドdeleteStudentInfoが含まれていると思います。 、changeStudentNamechangeStudentFirstNamechangeStudentLastName およびchangeStudentGrade また、テーブルの作成と入力に加えて、使用例も含まれています(改訂されたスキーマを検討することをお勧めします):-

    public class MainActivity extends AppCompatActivity {
    
        public static final String DBNAME = "study";
        public static final String STUDENT_TABLE_NAME = "STUDENT_TABLE";
        public static final String COL_STUDENT_ID = "studentid";
        public static final String COL_STUDENT_FIRSTNAME = "fname";
        public static final String COL_STUDENT_LASTNAME = "lname";
    
        public static final String CLASS_TABLE_NAME = "CLASS_TABLE";
        public static final String COL_CLASS_ID = "classid";
        public static final String COL_CLASS_NAME = "classname";
    
        public static final String GRADE_TABLE_NAME = "GRADE_TABLE";
        public static final String COL_GRADE_POINTGRADE = "pointgrade";
        public static final String COL_GRADE_LETTERGRADE = "lettergrade";
        public static final String BY_STUDENTID = COL_STUDENT_ID + "=?";
        public static final String BY_CLASSID = COL_CLASS_ID + "=?";
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            SQLiteDatabase db = openOrCreateDatabase(DBNAME,Context.MODE_PRIVATE,null);
            db.execSQL("CREATE TABLE IF NOT EXISTS " + STUDENT_TABLE_NAME + " (" +
                    COL_STUDENT_ID + " TEXT PRIMARY KEY, " +
                    COL_STUDENT_FIRSTNAME + " TEXT," +
                    COL_STUDENT_LASTNAME + " TEXT)"
            );
            db.execSQL("CREATE TABLE IF NOT EXISTS " + CLASS_TABLE_NAME + "(" +
                     COL_CLASS_ID + " TEXT PRIMARY KEY," +
                     COL_CLASS_NAME + " TEXT UNIQUE " +
                    ")"
            );
            db.execSQL("CREATE TABLE IF NOT EXISTS " + GRADE_TABLE_NAME + "(" +
                    COL_STUDENT_ID + " TEXT, " +
                    COL_CLASS_ID + " TEXT, " +
                    COL_GRADE_POINTGRADE + " INTEGER, " +
                    COL_GRADE_LETTERGRADE + " TEXT" +
                    ")"
            );
            db.execSQL("INSERT OR IGNORE INTO " + STUDENT_TABLE_NAME +
                    " VALUES" +
                    "('00001','Fred','Smith')," +
                    "('00010','Mary','Thomas')," +
                    "('00910','Angela','Jones')"
            );
            db.execSQL("INSERT OR IGNORE INTO " + CLASS_TABLE_NAME +
                    " VALUES" +
                    "('001','English')," +
                    "('101','Mathematics')," +
                    "('201','Chemistry')"
            );
            db.execSQL("INSERT OR IGNORE INTO " + GRADE_TABLE_NAME +
                    " VALUES" +
                    "    ('00001','001',99,'A'), -- Fred Smith has 99 point grade as an A in English\n" +
                    "    ('00001','101',25,'F'), -- Fred Smith has 25 point grade as an F on Mathematics\n" +
                    "    ('00010','201',76,'B'), -- Angela Jones 76 a B in Chemistry\n" +
                    "    ('00910','101',50,'C'), \n" +
                    "    ('00910','201',63,'C'),\n" +
                    "    ('00910','001',89,'A')\n" +
                    ";"
            );
    
            changeStudentName(db,"00001","Joe","Bloggs");
            changeStudentFirstName(db,"00001","Harry");
            changeStudentLastName(db,"00001","Hoffmann");
            // e.g. won't change due to -1 (skip pointsgrade) and null (skip lettergrade)
            changeStudentGrade(db,"00001","001",-1,null);
            // Change both
            changeStudentGrade(db,"00001","001",25,"D");
            changeStudentGrade(db,"00001","001",27,null);
    
            // Ooops invalid student id
            if (deleteStudentInfo(db,"001")) {
                Log.d("DELETION","Student 001 deleted.");
            } else {
                Log.d("DELETION","Ooops Student 001 not deleted?????");
            }
    
            // Corrected Student ID
            if (deleteStudentInfo(db,"00001")) {
                Log.d("DELETION","Student 001 deleted.");
            } else {
                Log.d("DELETION","Ooops Student 001 not deleted?????");
            }
        }
    
        private boolean deleteStudentInfo(SQLiteDatabase db, String studentid) {
    
            String tag = "STUDENT_DELETE";
            String student_table = "STUDENT_TABLE";
            String grade_table = "GRADE_TABLE";
    
            long pre_delete_student_count = DatabaseUtils.queryNumEntries(db,student_table);
            long pre_delete_grade_count = DatabaseUtils.queryNumEntries(db,grade_table);
    
            String whereclause = "studentid =?";
            String[] whereargs = {studentid};
    
            db.delete(student_table,whereclause,whereargs);
            db.delete(grade_table,whereclause,whereargs);
    
            long post_delete_student_count = DatabaseUtils.queryNumEntries(db,student_table);
            long post_delete_grade_count = DatabaseUtils.queryNumEntries(db,grade_table);
    
            Log.d(
                    tag,
                    "Number of Students deleted from " +
                            student_table + " is " +
                            String.valueOf(
                                    pre_delete_student_count - post_delete_student_count
                            ));
            Log.d(
                    tag,
                    "Number of Grades deleted from " + grade_table + " is " +
                            String.valueOf(
                                    pre_delete_grade_count - post_delete_grade_count
                            )
            );
            if ((pre_delete_student_count + pre_delete_grade_count) != (post_delete_student_count + post_delete_grade_count)) {
                return true;
            }
            return false;
        }
    
        /**
         * Flexible Student Name Change
         *
         * @param db            The SQliteDatabase
         * @param studentid     The studentid (String)
         * @param newfirstname  The new firstname, null or blank to leave as is
         * @param newlastname   the new lastname, null or blank to leave as is
         */
        private void changeStudentName(SQLiteDatabase db, String studentid, String newfirstname, String newlastname ) {
    
            //Anything to do? if not do nothing
            if ((newfirstname == null || newfirstname.length() < 1) && (newlastname == null || newlastname.length() < 1)) {
                return;
            }
            ContentValues cv = new ContentValues();
            if (newfirstname != null && newfirstname.length() > 0) {
                cv.put(COL_STUDENT_FIRSTNAME,newfirstname);
            }
            if (newlastname != null && newlastname.length() > 0) {
                cv.put(COL_STUDENT_LASTNAME,newlastname);
            }
            // Overcautious check
            if (cv.size() < 1) {
                return;
            }
            db.update(STUDENT_TABLE_NAME,cv,BY_STUDENTID,new String[]{studentid});
        }
    
        /**
         * Change a Student's First Name (invokes changeStudentName method)
         * @param db            The SQLiteDatabase
         * @param studentid     The student's id (String)
         * @param newfirstname  The new first name to apply
         */
        private void changeStudentFirstName(SQLiteDatabase db, String studentid, String newfirstname) {
            changeStudentName(db,studentid,newfirstname,null);
        }
    
        /**
         * Change a Student's Last Name (invokes changeStudentName method)
         * @param db
         * @param studentid
         * @param newlastname
         */
        private void changeStudentLastName(SQLiteDatabase db, String studentid, String newlastname) {
            changeStudentName(db,studentid,null,newlastname);
        }
    
        /**
         * Change a students grade (allowing just one (points/letter))
         * @param db
         * @param studentid
         * @param classid
         * @param newpointsgrade
         * @param newlettergrade
         */
        private void changeStudentGrade(SQLiteDatabase db, String studentid, String classid, int newpointsgrade, String newlettergrade) {
            // Anything to do? if not do nothing
            if (newpointsgrade < 0 && (newlettergrade == null || newlettergrade.length() < 1)) {
                return;
            }
            ContentValues cv = new ContentValues();
            if (newpointsgrade >= 0) {
                cv.put(COL_GRADE_POINTGRADE,newpointsgrade);
            }
            if (newlettergrade != null && newlettergrade.length() > 0) {
                cv.put(COL_GRADE_LETTERGRADE,newlettergrade);
            }
            String whereclause = COL_STUDENT_ID + "=? AND " + COL_CLASS_ID + "=?";
            String[] whereargs = new String[]{studentid,classid};
            db.update(GRADE_TABLE_NAME,cv,whereclause,whereargs);
        }
    }
    



    1. PL / SQLで変数のタイプを表示するにはどうすればよいですか?

    2. クリスマスプレゼントの配達:サンタのデータモデル

    3. 空のクラスター化テーブルへのINSERT…SELECTによる最小限のロギング

    4. 16進数のテキスト文字列をbyteaとしてPostgreSQLに挿入する