1. 程式人生 > >Android專案中,在一個數據庫裡建立多張表

Android專案中,在一個數據庫裡建立多張表

一,建立一個公共的DBAdapter;

為了在整個程式執行期間呼叫該公共的資料庫,我們定義了一個擴充套件自Application的CommDB類:

1,建立唯一的資料庫:

複製程式碼
 1 public class CommDB {
 2 
 3     public static final String DATABASE_NAME = "myDatabase"; //資料庫名稱
 4 
 5     public static final int DATABASE_VERSION = 1;
 6     //建立該資料庫下學生表的語句
 7     private static final String CREATE_TABLE_Students =
 8
"CREATE TABLE if not exists " + StudentDB.SQLITE_TABLE + " (" + 9 StudentDB.KEY_ROWID + " integer PRIMARY KEY autoincrement," + 10 StudentDB.KEY_AGE + "," + 11 StudentDB.KEY_GENDER + "," + 12 StudentDB.KEY_NAME + "," + 13 " UNIQUE (" + StudentDB.KEY_NAME +"));";//
暫時規定不能重名 14 //建立該資料庫下教師表的語句 15 private static final String CREATE_TABLE_Teachers = 16 "CREATE TABLE if not exists " + TeacherDB.SQLITE_TABLE + " (" + 17 TeacherDB.KEY_ROWID + " integer PRIMARY KEY autoincrement," + 18 TeacherDB.KEY_AGE + "," + 19 TeacherDB.KEY_GENDER + "," + 20
TeacherDB.KEY_NAME + "," + 21 " UNIQUE (" + TeacherDB.KEY_AGE +"));"; 22 private final Context context; 23 private DatabaseHelper DBHelper; 24 private SQLiteDatabase db; 25 /** 26 * Constructor 27 * @param ctx 28 */ 29 public CommDB(Context ctx) 30 { 31 this.context = ctx; 32 this.DBHelper = new DatabaseHelper(this.context); 33 } 34 35 private static class DatabaseHelper extends SQLiteOpenHelper 36 { 37 DatabaseHelper(Context context) 38 { 39 super(context, DATABASE_NAME, null, DATABASE_VERSION); 40 } 41 42 @Override 43 public void onCreate(SQLiteDatabase db) 44 { 45 db.execSQL(CREATE_TABLE_Students);//建立學生表 46 db.execSQL(CREATE_TABLE_Teachers);//建立教師表 47 } 48 49 @Override 50 public void onUpgrade(SQLiteDatabase db, int oldVersion, 51 int newVersion) 52 { 53 // Adding any table mods to this guy here 54 } 55 } 56 57 /** 58 * open the db 59 * @return this 60 * @throws SQLException 61 * return type: DBAdapter 62 */ 63 public CommDB open() throws SQLException 64 { 65 this.db = this.DBHelper.getWritableDatabase(); 66 return this; 67 } 68 69 /** 70 * close the db 71 * return type: void 72 */ 73 public void close() 74 { 75 this.DBHelper.close(); 76 } 77 }
複製程式碼

2,在app開始執行時,建立上述的資料庫,並建立對應的資料表:

複製程式碼
 1 public class GApplication extends Application {
 2     private CommDB comDBHelper;
 3 
 4     @Override
 5     public void onCreate() {
 6         // TODO Auto-generated method stub
 7         super.onCreate();
 8         comDBHelper = new CommDB(this);
 9         comDBHelper.open();
10     }
11     
12 }
複製程式碼

二,分別建立對應的資料表;

1,建立學生資料表類:

複製程式碼
public class StudentDB {
    public static final String KEY_ROWID = "_id";
    public static final String KEY_AGE = "age";
    public static final String KEY_GENDER = "gender";
    public static final String KEY_NAME = "name";

    private static final String TAG = "StudentDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    
    // private static final String DATABASE_NAME = "Fortrun_Ticket11";
    static final String SQLITE_TABLE = "StudentTable";

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {

            super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + SQLITE_TABLE);
            onCreate(db);
        }
    }

    public StudentDB(Context ctx) {
        this.mCtx = ctx;
    }

    public StudentDB open() throws SQLException {

        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        if (mDbHelper != null) {
            mDbHelper.close();
        }
    }

    /**
     * 建立學生表的欄位
     * @param age
     * @param gender
     * @param name
     * @return
     */
    public long createStudent(String age, String gender, String name) {
        long createResult = 0;
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_AGE, age);
        initialValues.put(KEY_GENDER, gender);
        initialValues.put(KEY_NAME, name);
        try {
            createResult = mDb.insert(SQLITE_TABLE, null, initialValues);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return createResult;
    }

    /**
     * 刪除表的全部欄位資料
     * @return
     */
    public boolean deleteAllStudents() {
        int doneDelete = 0;
        try {
            doneDelete = mDb.delete(SQLITE_TABLE, null, null);
            Log.w(TAG, Integer.toString(doneDelete));
            Log.e("doneDelete", doneDelete + "");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return doneDelete > 0;
    }

    /**
     * 根據名稱刪除表中的資料 
     * @param name
     * @return
     */
    public boolean deleteTicketByName(String name) {
        int isDelete;
        String[] tName;
        tName = new String[] { name };
        isDelete = mDb.delete(SQLITE_TABLE, KEY_AGE + "=?", tName);
        Log.e("deleteTicket", "isDelete:" + isDelete + "||" + "ticketID="
                + name);
        return isDelete > 0;
    }
    public void insertSomeTickets() {
        
    }


    /**
     * 獲取表中的所有欄位
     * @return
     */
    public ArrayList<Student> fetchAll() {

        ArrayList<Student> allTicketsList = new ArrayList<Student>();
        Cursor mCursor = null;
        mCursor = mDb.query(SQLITE_TABLE, new String[] { KEY_ROWID, KEY_AGE,
                KEY_GENDER, KEY_NAME }, null, null, null, null, null);
        if (mCursor.moveToFirst()) {
            do {
                Student st = new Student();
                st.setAge(mCursor.getString(mCursor
                        .getColumnIndexOrThrow(KEY_AGE)));
                st.setGender(mCursor.getString(mCursor
                        .getColumnIndexOrThrow(KEY_GENDER)));
                st.setName(mCursor.getString(mCursor
                        .getColumnIndexOrThrow(KEY_NAME)));
                allTicketsList.add(st);
            } while (mCursor.moveToNext());
        }
        if (mCursor != null && !mCursor.isClosed()) {
            mCursor.close();
        }
        return allTicketsList;
    }

}
複製程式碼

2,建立教師資料表類:

複製程式碼
public class TeacherDB {
    public static final String KEY_ROWID = "_id";
    public static final String KEY_AGE = "age";
    public static final String KEY_GENDER = "gender";// 還要保留
    public static final String KEY_NAME = "name";

    private static final String TAG = "TeacherDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    // private static final String DATABASE_NAME = "Fortrun_Ticket11";
    static final String SQLITE_TABLE = "TeacherTable";
    private static final int DATABASE_VERSION = 1;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {

            super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // Log.w(TAG, DATABASE_CREATE);
            // db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + SQLITE_TABLE);
            onCreate(db);
        }
    }

    public TeacherDB(Context ctx) {
        this.mCtx = ctx;
    }

    public TeacherDB open() throws SQLException {

        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        if (mDbHelper != null) {
            mDbHelper.close();
        }
    }

    public long createTeacher(String age, String gender, String name) {
        long createResult = 0;
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_AGE, age);
        initialValues.put(KEY_GENDER, gender);
        initialValues.put(KEY_NAME, name);
        try {
            createResult = mDb.insert(SQLITE_TABLE, null, initialValues);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return createResult;
    }

    public boolean deleteAllTeachers() {
        int doneDelete = 0;
        try {
            doneDelete = mDb.delete(SQLITE_TABLE, null, null);
            Log.w(TAG, Integer.toString(doneDelete));
            Log.e("doneDelete", doneDelete + "");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return doneDelete > 0;
    }

    public boolean deleteTeacherByName(String name) {
        int isDelete;
        String[] tName;
        tName = new String[] { name };
        isDelete = mDb.delete(SQLITE_TABLE, KEY_AGE + "=?", tName);
        Log.e("deleteTicket", "isDelete:" + isDelete + "||" + "ticketID="
                + name);
        return isDelete > 0;
    }
    public void insertSomeTickets() {
        
    }


    // 掃描時進行判斷本地資料庫是否有此ticketID
    public ArrayList<Teacher> fetchAll() {

        ArrayList<Teacher> allTeacherList = new ArrayList<Teacher>();
        Cursor mCursor = null;
        mCursor = mDb.query(SQLITE_TABLE, new String[] { KEY_ROWID, KEY_AGE,
                KEY_GENDER, KEY_NAME }, null, null, null, null, null);
        if (mCursor.moveToFirst()) {
            do {
                Teacher st = new Teacher();
                st.setAge(mCursor.getString(mCursor
                        .getColumnIndexOrThrow(KEY_AGE)));
                st.setGender(mCursor.getString(mCursor
                        .getColumnIndexOrThrow(KEY_GENDER)));
                st.setName(mCursor.getString(mCursor
                        .getColumnIndexOrThrow(KEY_NAME)));
                allTeacherList.add(st);
            } while (mCursor.moveToNext());
        }
        if (mCursor != null && !mCursor.isClosed()) {
            mCursor.close();
        }
        return allTeacherList;
    }

}
複製程式碼

三,呼叫public class ShowActivity extends Activity {

複製程式碼
private StudentDB studentDB;
private TeacherDB teacherDB;
private List<Student> stList = new ArrayList<Student>();
private List<Teacher> trList = new ArrayList<Teacher>();
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
        studentDB = new StudentDB(this);
        studentDB.open();
        
        teacherDB = new TeacherDB(this);
        teacherDB.open();
        
        studentDB.createStudent("28", "男", "阿武");
        studentDB.createStudent("24", "女", "小鈴");
        
        teacherDB.createTeacher("40", "男", "何SIR");
        teacherDB.createTeacher("45", "女", "MRS謝");
        stList = studentDB.fetchAll();
        trList = teacherDB.fetchAll();
        for (int i = 0; i < stList.size(); i++) {
            Log.e("stList value", stList.get(i).getName());
        }
        for (int i = 0; i < trList.size(); i++) {
            Log.e("trList value", trList.get(i).getName());
        }
    }

@Override
protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if (studentDB != null) { studentDB.close(); } if (teacherDB != null) { teacherDB.close(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.show, menu); return true; } }
複製程式碼

四,結果驗證;

10-25 16:50:10.321: E/stList value(3953): 阿武
10-25 16:50:10.321: E/stList value(3953): 小鈴
10-25 16:50:10.321: E/trList value(3953): 何SIR
10-25 16:50:10.321: E/trList value(3953): MRS謝

五,注意事項:

此例子中插入資料庫的資料是以年齡作為唯一欄位,當插入的資料中,年齡欄位有重複時,資料庫會報錯,此例子只為說明如何在一個數據庫中建立多張表,因此,在實際專案中,一般以某個實體的ID作為唯一欄位,且插入前必須經過判斷;

另外,資料庫的關閉,我們選擇在onDestroy()方法中呼叫。