Android項目中,在一個數據庫裏創建多張表

一,建立一個公共的DBAdapter;數據庫

爲了在整個程序運行期間調用該公共的數據庫,咱們定義了一個擴展自Application的CommDB類:app

1,建立惟一的數據庫:ide

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開始運行時,建立上述的數據庫,並建立對應的數據表:fetch

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 }

二,分別建立對應的數據表;this

1,創建學生數據表類:spa


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,建立教師數據表類:.net

複製代碼

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 {code

複製代碼

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;    } }

複製代碼

 

四,結果驗證;orm

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謝rem

五,注意事項:

此例子中插入數據庫的數據是以年齡做爲惟一字段,當插入的數據中,年齡字段有重複時,數據庫會報錯,此例子只爲說明如何在一個數據庫中創建多張表,所以,在實際項目中,通常以某個實體的ID做爲惟一字段,且插入前必須通過判斷;

另外,數據庫的關閉,咱們選擇在onDestroy()方法中調用。

相關文章
相關標籤/搜索