1, 昨天的成就:
a) 完成的任务:连接数据库
b) 所花时间:20h
c) 还剩余0h
2, 遇到的困难:
a) 加入课程时出现错误,加不进去
3, 今天的任务:将加入课程实现。
package com.mnnyang.gzuclassschedule.data.db; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.NonNull; import com.mnnyang.gzuclassschedule.app.app; import com.mnnyang.gzuclassschedule.data.bean.Course; import com.mnnyang.gzuclassschedule.data.bean.CsItem; import com.mnnyang.gzuclassschedule.data.bean.CsName; import com.mnnyang.gzuclassschedule.utils.LogUtil; import java.util.ArrayList; /** * Created by mnnyang on 17-11-1. */ public class CourseDbDao { private CourseDbDao() { } public boolean removeByCsName(String csName) { return removeByCsNameId(getCsNameId(csName)); } private static final class Holder { private static final CourseDbDao DAO = new CourseDbDao(); } public static CourseDbDao instance() { return Holder.DAO; } /** * 添加课程<br> * 应检查课程信息的准确性后再调用该方法 <br> * * @return success return null or return conflict object */ public Course addCourse(Course course) { Course conflictCourse = hasConflictCourse(course); if (null != conflictCourse) { LogUtil.e(this, "有冲突"); return conflictCourse; } SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); ContentValues values = new ContentValues(); putAllNotId(course, values); db.beginTransaction(); try { long courseId = db.insert(CoursesPsc.CourseEntry.TABLE_NAME, null, values); for (Integer integer : course.getNodes()) { values.clear(); values.put(CoursesPsc.NodeEntry.COLUMN_NAME_COURSE_ID, courseId); values.put(CoursesPsc.NodeEntry.COLUMN_NAME_NODE_NUM, integer); db.insert(CoursesPsc.NodeEntry.TABLE_NAME, null, values); } db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); } db.close(); return null; } /** * 更新 */ public Course updateCourse(Course course) { Course conflictCourse = hasConflictCourse(course); if (null != conflictCourse) { return conflictCourse; } SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); db.beginTransaction(); try { // course.setCsNameId() ContentValues values = new ContentValues(); putAllNotId(course, values); db.update(CoursesPsc.CourseEntry.TABLE_NAME, values, CoursesPsc.CourseEntry.COLUMN_NAME_COURSE_ID + "=?", new String[]{course.getCourseId() + ""}); deleteNodeByCourseId(course.getCourseId(), db); for (Integer integer : course.getNodes()) { values.clear(); values.put(CoursesPsc.NodeEntry.COLUMN_NAME_COURSE_ID, course.getCourseId()); values.put(CoursesPsc.NodeEntry.COLUMN_NAME_NODE_NUM, integer); db.insert(CoursesPsc.NodeEntry.TABLE_NAME, null, values); } db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); db.close(); } return null; } public boolean removeByCsNameId(int id) { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); try { db.beginTransaction(); db.delete(CoursesPsc.CourseEntry.TABLE_NAME, CoursesPsc.CourseEntry.COLUMN_NAME_CS_NAME_ID + "=?" , new String[]{String.valueOf(id)}); db.delete(CoursesPsc.CsNameEntry.TABLE_NAME, CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID + "=?", new String[]{String.valueOf(id)}); db.setTransactionSuccessful(); return true; } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); db.close(); } return false; } public void removeCourse(int courseId) { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); removeCourse(courseId, db); db.close(); } //TODO ~~~~~~ private void removeCourse(int courseId, SQLiteDatabase db) { db.delete(CoursesPsc.CourseEntry.TABLE_NAME, CoursesPsc.CourseEntry.COLUMN_NAME_COURSE_ID + "=?", new String[]{courseId + ""}); deleteNodeByCourseId(courseId, db); } public boolean removeAllData() { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); try { db.beginTransaction(); db.delete(CoursesPsc.NodeEntry.TABLE_NAME, null, null); db.delete(CoursesPsc.CsNameEntry.TABLE_NAME, null, null); db.delete(CoursesPsc.CourseEntry.TABLE_NAME, null, null); db.setTransactionSuccessful(); return true; } catch (Exception e) { e.printStackTrace(); return false; } finally { db.endTransaction(); db.close(); } } private void deleteNodeByCourseId(int courseId, SQLiteDatabase db) { db.delete(CoursesPsc.NodeEntry.TABLE_NAME, CoursesPsc.NodeEntry.COLUMN_NAME_COURSE_ID + "=?", new String[]{courseId + ""}); } /** * 课程冲突判断<br> * * @param course must be have csName */ private Course hasConflictCourse(Course course) { LogUtil.e(this,"冲突检查:-->"+course.toString()); SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); int csNameId = getCsNameId(course.getCsName(), db); course.setCsNameId(csNameId); String sql = "select * from " + CoursesPsc.CourseEntry.TABLE_NAME + " WHERE " + CoursesPsc.CourseEntry.COLUMN_NAME_CS_NAME_ID + "='" + course.getCsNameId() + "'" + " AND " + CoursesPsc.CourseEntry.COLUMN_NAME_COURSE_ID + "!='" + course.getCourseId() + "'"; Cursor cursor = db.rawQuery(sql, null); while (cursor.moveToNext()) { Course conflictCourse = parse(cursor); LogUtil.e(this,"疑是冲突:-->"+course.toString()); sql = "select * from " + CoursesPsc.NodeEntry.TABLE_NAME + " where " + CoursesPsc.NodeEntry.COLUMN_NAME_COURSE_ID + "=" + conflictCourse.getCourseId(); Cursor nodeCursor = db.rawQuery(sql, null); while (nodeCursor.moveToNext()) { conflictCourse.addNode(nodeCursor.getInt(nodeCursor.getColumnIndex(CoursesPsc.NodeEntry.COLUMN_NAME_NODE_NUM))); } nodeCursor.close(); if (course.equals(conflictCourse)) { LogUtil.e(this, course.getName() + " 和 " + conflictCourse.toString() + "冲突!!"); cursor.close(); db.close(); return conflictCourse; } } cursor.close(); db.close(); return null; } /** * 课程表名称冲突 * * @param csName * @return */ public boolean hasConflictCourseTableName(String csName) { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); String sql = "select * from " + CoursesPsc.CsNameEntry.TABLE_NAME + " where `" + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME + "`='" + csName + "'"; System.out.println(sql); Cursor cursor = db.rawQuery(sql, null); return cursor.moveToNext(); } /** * 根据课程表名获取课程表名id 不存在则插入 */ public int getCsNameId(String csName) { LogUtil.w(this, "在获取课表名:" + csName + "的id"); SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); int id = getCsNameId(csName, db); db.close(); return id; } public int getCsNameId(String csName, SQLiteDatabase db) { String sql = "select * from " + CoursesPsc.CsNameEntry.TABLE_NAME + " where `" + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME + "`='" + csName + "'"; LogUtil.i(this, sql); Cursor cursor = db.rawQuery(sql, null); if (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex(CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID)); cursor.close(); return id; } else { ContentValues values = new ContentValues(); values.put(CoursesPsc.CsNameEntry.COLUMN_NAME_NAME, csName); return (int) db.insert(CoursesPsc.CsNameEntry.TABLE_NAME, null, values); } } /** * @param csNameId * @param newCsName * @return conflict return 0 */ public int updateCsName(int csNameId, String newCsName) { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); String sql = "select * from " + CoursesPsc.CsNameEntry.TABLE_NAME + " where `" + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID + "`!=" + csNameId + " and `" + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME + "`='" + newCsName + "'"; Cursor cursor = db.rawQuery(sql, null); if (cursor.moveToNext()) { cursor.close(); db.close(); return 0; } cursor.close(); ContentValues values = new ContentValues(); values.put(CoursesPsc.CsNameEntry.COLUMN_NAME_NAME, newCsName); int update = db.update(CoursesPsc.CsNameEntry.TABLE_NAME, values, CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID + "=?", new String[]{String.valueOf(csNameId)}); db.close(); return update; } public String getCsName(int csNameId) { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); String sql = "select * from " + CoursesPsc.CsNameEntry.TABLE_NAME + " where `" + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID + "`='" + csNameId + "'"; System.out.println(sql); Cursor cursor = db.rawQuery(sql, null); if (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(CoursesPsc.CsNameEntry.COLUMN_NAME_NAME)); cursor.close(); db.close(); return name; } return ""; } /** * 加载课程数据 */ public ArrayList<Course> loadCourses(String csName) { SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); int csNameId = getCsNameId(csName, db); db.close(); return loadCourses(csNameId); } @NonNull public ArrayList<Course> loadCourses(int csNameId) { String csName = getCsName(csNameId); SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); String sql = "select * from " + CoursesPsc.CourseEntry.TABLE_NAME + " where " + CoursesPsc.CourseEntry.COLUMN_NAME_CS_NAME_ID + "='" + csNameId + "'"; Cursor cursor = db.rawQuery(sql, null); ArrayList<Course> courses = new ArrayList<>(); while (cursor.moveToNext()) { Course course = parse(cursor); course.setCsName(csName); courses.add(course); sql = "select * from " + CoursesPsc.NodeEntry.TABLE_NAME + " where " + CoursesPsc.NodeEntry.COLUMN_NAME_COURSE_ID + "=" + course.getCourseId(); Cursor nodeCursor = db.rawQuery(sql, null); while (nodeCursor.moveToNext()) { course.addNode(nodeCursor.getInt(nodeCursor.getColumnIndex(CoursesPsc.NodeEntry.COLUMN_NAME_NODE_NUM))); } nodeCursor.close(); } cursor.close(); db.close(); return courses; } public ArrayList<CsItem> loadCsNameList() { ArrayList<CsItem> csItems = new ArrayList<>(); SQLiteDatabase db = new CourseDbHelper(app.mContext).getWritableDatabase(); Cursor cursor = db.query(CoursesPsc.CsNameEntry.TABLE_NAME, null, null, null, null, null, null); while (cursor.moveToNext()) { int nameId = cursor.getInt(cursor.getColumnIndex(CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID)); String name = cursor.getString(cursor.getColumnIndex(CoursesPsc.CsNameEntry.COLUMN_NAME_NAME)); //TODO 额外数据 例如数据的条数 CsItem csItem = new CsItem(); csItem.setCsName(new CsName().setName(name).setCsNameId(nameId)); csItems.add(csItem); } cursor.close(); db.close(); return csItems; } private void putAllNotId(Course course, ContentValues values) { values.put(CoursesPsc.CourseEntry.COLUMN_NAME_NAME, course.getName()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_CLASS_ROOM, course.getClassRoom()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_CS_NAME_ID, course.getCsNameId()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_WEEK, course.getWeek()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_START_WEEK, course.getStartWeek()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_END_WEEK, course.getEndWeek()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_TEACHER, course.getTeacher()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_SOURCE, course.getSource()); values.put(CoursesPsc.CourseEntry.COLUMN_NAME_WEEK_TYPE,course.getWeekType()); } private Course parse(Cursor cursor) { Course course = new Course(); course.setName(cursor.getString(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_NAME))) .setClassRoom(cursor.getString(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_CLASS_ROOM))) .setTeacher(cursor.getString(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_TEACHER))) .setWeek(cursor.getInt(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_WEEK))) .setStartWeek(cursor.getInt(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_START_WEEK))) .setEndWeek(cursor.getInt(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_END_WEEK))) .setSource(cursor.getString(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_SOURCE))) .setCsNameId(cursor.getInt(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_CS_NAME_ID))) .setWeekType(cursor.getInt(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_WEEK_TYPE))) .setCourseId(cursor.getInt(cursor.getColumnIndex(CoursesPsc.CourseEntry.COLUMN_NAME_COURSE_ID))); return course; } }
package com.mnnyang.gzuclassschedule.data.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.mnnyang.gzuclassschedule.R; import com.mnnyang.gzuclassschedule.app.app; import com.mnnyang.gzuclassschedule.utils.Preferences; /** * Created by mnnyang on 17-10-23. */ public class CourseDbHelper extends SQLiteOpenHelper { public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "course.db"; private static final String TEXT_TYPE = " TEXT"; private static final String INTEGER_TYPE = " INTEGER"; private static final String COMMA_SEP = ","; private static final String SQL_CREATE_COURSES = "CREATE TABLE " + CoursesPsc.CourseEntry.TABLE_NAME + " (" + CoursesPsc.CourseEntry.COLUMN_NAME_COURSE_ID + INTEGER_TYPE + " PRIMARY KEY AUTOINCREMENT" + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_CS_NAME_ID + INTEGER_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_NAME + TEXT_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_CLASS_ROOM + TEXT_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_TEACHER + TEXT_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_WEEK + INTEGER_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_START_WEEK + INTEGER_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_END_WEEK + INTEGER_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_WEEK_TYPE + INTEGER_TYPE + COMMA_SEP + CoursesPsc.CourseEntry.COLUMN_NAME_SOURCE + TEXT_TYPE + " )"; private static final String SQL_CREATE_NODE = "CREATE TABLE " + CoursesPsc.NodeEntry.TABLE_NAME + " (" + CoursesPsc.NodeEntry.COLUMN_NAME_COURSE_ID + INTEGER_TYPE + COMMA_SEP + CoursesPsc.NodeEntry.COLUMN_NAME_NODE_NUM + INTEGER_TYPE + " )"; private static final String SQL_CREATE_CS_NAME = "CREATE TABLE " + CoursesPsc.CsNameEntry.TABLE_NAME + " (" + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME_ID + INTEGER_TYPE + " PRIMARY KEY AUTOINCREMENT" + COMMA_SEP + CoursesPsc.CsNameEntry.COLUMN_NAME_NAME + TEXT_TYPE + " )";