Android菜鳥練習第三十三課 數據庫的基本使用

第一部分 DBHelper部分

/**
 * 數據庫Helper類,必須繼承自 SQLiteOpenHelper
 * 當一個繼承自 SQLiteOpenHelper 後需要複寫兩個方法,分別是 onCreate()  和 onUpgrade()
 * onCreate(): onCreate是在數據庫創建的時候調用的,主要用來初始化數據表結構和插入數據初始化的記錄
 * onUpgrade():onUpGrade是在數據庫版本升級的時候調用的,主要用來改變表結構
 *
 *
 *  數據庫幫助類要做的事情特別簡單:
 *  1、複寫onCreate()  和 onUpgrade()方法
 *  2、在這兩個方法裏面填寫相關的sql語句
 *
 *
 */
public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context) {
        /**
         * 參數說明:
         *
         * 第一個參數: 上下文
         * 第二個參數:數據庫的名稱
         * 第三個參數:null代表的是默認的遊標工廠
         * 第四個參數:是數據庫的版本號  數據庫只能升級,不能降級,版本號只能變大不能變小
         */
        super(context, "mintest.db", null, 2);
    }

    /**
     * onCreate是在數據庫創建的時候調用的,主要用來初始化數據表結構和插入數據初始化的記錄
     *
     * 當數據庫第一次被創建的時候調用的方法,適合在這個方法裏面把數據庫的表結構定義出來.
     * 所以只有程序第一次運行的時候纔會執行
     * 如果想再看到這個函數執行,必須寫在程序然後重新安裝這個app
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table contactinfo (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
    }

    /**
     * 當數據庫更新的時候調用的方法
     * 這個要顯示出來得在上面的super語句裏面版本號發生改變時纔會 打印  (super(context, "itheima.db", null, 2); )
     * 注意,數據庫的版本號只可以變大,不能變小,假設我們當前寫的版本號是3,運行,然後又改成1,運行則報錯。不能變小
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table contactinfo add account varchar(20)");
    }
}

第二部分 DAO工具類

/**
 *  ContactInjfoDao  數據庫操作類  dao後綴的都是數據庫操作類
 *
 *  我們這裏的每一個 增刪改查 的方法都通過getWritableDatabase()去實例化了一個數據庫,這裏必須這麼做
 *  不客氣抽取 成爲一個成員變量, 否則報錯,若是覺得麻煩可以通過定義方法來置爲null和重新賦值
 *
 *  —— 其實dao類在這裏做得事情特別簡單:
 *  1、定義一個構造方法,利用這個方法去實例化一個  數據庫幫助類
 *  2、編寫dao類的對應的 增刪改查 方法。
 *
 */

public class ContactInjfoDao {
    private DBHelper DBhelper;

    /**
     * dao類需要實例化數據庫Help類,只有得到幫助類的對象我們纔可以實例化 SQLiteDatabase
     * @param context
     */
    public ContactInjfoDao(Context context){
        // 將數據庫打開幫幫助類實例化,然後利用這個對象
        // 調用谷歌的api去進行增刪改查
        DBhelper = new DBHelper(context);
    }
    // 增加的方法嗎,返回的的是一個long值
    public long addDate(String name,String phone){
        // 增刪改查每一個方法都要得到數據庫,然後操作完成後一定要關閉
        // getWritableDatabase(); 執行後數據庫文件纔會生成
        // 數據庫文件利用DDMS可以查看,在 data/data/包名/databases 目錄下即可查看
        SQLiteDatabase sqLiteDatabase =  DBhelper.getWritableDatabase();
        ContentValues contentValues=new ContentValues();

        contentValues.put("name",name);
        contentValues.put("phone", phone);
        // 返回,顯示數據添加在第幾行
        // 加了現在連續添加了3行數據,突然刪掉第三行,然後再添加一條數據返回的是4不是3
        // 因爲自增長
        long rowid=sqLiteDatabase.insert("contactinfo",null,contentValues);

        sqLiteDatabase.close();
        return rowid;
    }
    // 刪除的方法,返回值是int
    public int deleteDate(String name){
        SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
        int deleteResult = sqLiteDatabase.delete("contactinfo", "name=?", new String[]{name});
        sqLiteDatabase.close();
        return deleteResult;
    }

    /**
     * 修改的方法
     * @param name
     * @param newPhone
     * @return
     */
    public int updateData(String name,String newPhone){
        SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
        ContentValues contentValues =new ContentValues();
        contentValues.put("phone", newPhone);
        int updateResult = sqLiteDatabase.update("contactinfo", contentValues, "name=?", new String[]{name});
        sqLiteDatabase.close();
        return updateResult;
    }

    /**
     * 查詢的方法(查找電話)
     * @param name
     * @return
     */
    public String alterDate(String name){
        String phone = null;

        SQLiteDatabase readableDatabase = DBhelper.getReadableDatabase();
        // 查詢比較特別,涉及到 cursor
        Cursor cursor = readableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
        if(cursor.moveToNext()){
            phone=cursor.getString(0);
        }
        cursor.close(); // 記得關閉 corsor
        readableDatabase.close(); // 關閉數據庫
        return phone;
    }

}
第三部分 Activity部分
public class MainActivity extends AppCompatActivity {
    private EditText mEtName, mEtPhone;
    private ContactInjfoDao mDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDao = new ContactInjfoDao(MainActivity.this);
        mEtName = (EditText) findViewById(R.id.mEtName);
        mEtPhone = (EditText) findViewById(R.id.mEtPhone);

    }

    //向數據庫中添加數據
    public void add(View view){

        String name=mEtName.getText().toString().trim();
        String phone=mEtPhone.getText().toString().trim();
        if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
            Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            long addLong = mDao.addDate(name, phone);
            if(addLong==-1){
                Toast.makeText(this,"添加失敗",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"數據添加在第  "+addLong+"   行",Toast.LENGTH_SHORT).show();
            }

        }
    }

    //刪除數據庫中的數據
    public void delete(View view){
        String name=mEtName.getText().toString().trim();

        if(TextUtils.isEmpty(name)){
            Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            int deleteDate = mDao.deleteDate(name);
            if(deleteDate==-1){
                Toast.makeText(this,"刪除失敗",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"成功刪除  "+deleteDate+"   條數據",Toast.LENGTH_SHORT).show();
            }

        }

    }


    //修改數據中的數據
    public void update(View view){

        String name=mEtName.getText().toString().trim();
        String phone=mEtPhone.getText().toString().trim();
        if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
            Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            int count=mDao.updateData(name, phone);
            if(count==-1){
                Toast.makeText(this,"更新失敗",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"數據更新了  "+count+"   行",Toast.LENGTH_SHORT).show();
            }

        }
    }


    //查詢數據庫中的數據
    public void query(View view){

        String name=mEtName.getText().toString().trim();

        if(TextUtils.isEmpty(name)){
            Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            String phoneResult = mDao.alterDate(name);

            Toast.makeText(this,"手機號碼爲:    "+phoneResult,Toast.LENGTH_SHORT).show();

        }
    }

}
第四部分 佈局部分
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context=".MainActivity" >
    <EditText
        android:id="@+id/mEtName"
        android:hint="請輸入聯繫人的姓名"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    </EditText>
    <EditText
        android:id="@+id/mEtPhone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入聯繫人的電話"
        android:inputType="phone" />
    <Button
        android:onClick="add"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="添加" />
    <Button
        android:onClick="delete"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="刪除" />
    <Button
        android:onClick="update"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="修改" />
    <Button
        android:onClick="query"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="查詢" />
</LinearLayout>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章