Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據庫入門

Android數據庫入門

編輯:關於Android編程

數據庫的創建
1.寫一個類繼承SQLiteOpenHelper(構造,onCreate,onUpgrade)
/**
 *數據庫的幫助類
 *要創建數據庫操作的對象,必須借助幫助類對象
 */
public class MyHelper extends SQLiteOpenHelper {
    public MyHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context,// 數據庫幫助類要依賴的上下文對象
                name,// 數據庫文件的名字(不是表名)數據庫的名字,後綴名可加可不加
                factory,// 游標工廠,用來創建數據,一般為空
                version);// 數據庫的版本號,從1開始
    }
    @Override
    /**
    *在第一次 創建數據庫的調用,在此方法中一般用於創建表和初始化表中的數據
    *db:數據庫的操作對象
    */
    public void onCreate(SQLiteDatabase db) {
        String sqlcreate="create table student (_id integer primary key autoincrement," +
                " name varchar(20)," +
                "age integer) ";
        db.execSQL(sqlcreate);
    }
    @Override
    /**
     * 數據庫版本升級的時候調用
     * db:數據庫操作的對象
     * oldVersion:數據庫的舊版本號
     * newVersion: 數據庫的新版本號
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion>oldVersion) {
            // 刪除舊表,創建新表
            db.execSQL("drop table if exists student ");
            onCreate(db);
        }
    }
}
2.獲取到一個數據庫的操作對象
    // 版本號不能降低,只能增加,可以跳躍增加
    helper=new MyHelper(this, DB_NAME, null, 2);
    // 獲取到一個可讀可寫的數據庫對象,得到數據對象的時候就會去調用Helper中的部分方法,若磁盤空間滿,會產生異常
    db=helper.getWritableDatabase();
    // 獲取到的也是一個可讀可寫的數據庫對象,但在特殊情況下eg:磁盤空間滿了,該數據庫對象變成只讀的了
    db=helper.getReadableDatabase();
數據庫的第一種增刪改查(使用SQL語句)
public class MainActivity extends Activity {
    private SQLiteDatabase db;
    private MyHelper helper;
    private static final String DB_NAME="first.db";//數據庫的名字,後綴名可加可不加
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=(TextView) findViewById(R.id.textview);
        // 版本號不能降低,只能增加,可以跳躍增加
        helper=new MyHelper(this, DB_NAME, null, 2);
        // 獲取到一個可讀可寫的數據庫對象
        db=helper.getWritableDatabase();
        // 獲取到的也是一個可讀可寫的數據庫對象,但在特殊情況下eg:磁盤空間滿了,該數據庫對象變成只讀的了
        db=helper.getReadableDatabase();

//      insertData();
//      deleteData();
//      updateData();
        selectData();

    }
    /**
     * 插入數據
     */
    public void insertData(){
        String sql="insert into student( name,age) values ('name1',18)";
        db.execSQL(sql);
        // 推薦使用
        db.execSQL("insert into student( name,age) values (?,?)", new Object[]{"name2",19});
    }
    /**
     * 刪除數據
     */
    public void deleteData(){// 下面的三條語句等效
        db.execSQL("delete from student where _id = 2");
//      db.execSQL("delete from student where _id = ? ", new Object[]{2});
//      db.execSQL("delete from student where _id = 2", null);
    }
//  修改數據
    public void updateData(){
        db.execSQL("update student set name='qqq',age=25 where _id=3 ");
        db.execSQL("update student set name= ? ,age= ? where _id= ? ",new Object[]{"www",29,4});
    }

//  查詢數據
    public void selectData(){
        Cursor cursor = db.rawQuery("select name,age from student ",null);
       // Cursor cursor = db.rawQuery("select name,age from student where age= ?",new String[]{"25"});
        //cursor.moveToNext(): 讓游標依次向下一行移動,如果下一行有數據返回true,沒有數據返回false
        while(cursor.moveToNext()){
            /*查詢方式一:
             * //根據查詢出一行裡面name所在的列號(從0開始一次增加),列號與查詢的字段相對應
            String name = cursor.getString(0);
            int age=cursor.getInt(1);
            textView.append(name+"="+age);*/

            //查詢方式二:
            //根據列名獲取到列號,後續的就不用改變,推薦使用
            int nameIndex = cursor.getColumnIndex("name");
            int ageIndex = cursor.getColumnIndex("age");
            String name = cursor.getString(nameIndex);
            int age=cursor.getInt(ageIndex);
        }
    }

數據庫的第二種增刪改查(使用Android的方法)
建表語句
db.execSQL("create table food (_id integer primary key autoincrement," +
                "name varchar ," +
                "price varchar(10))");
   插入數據
    private void insertApi(){
         /*
          * 參數解釋insert(table, nullColumnHack, values)==>()
          * table:表名
          * nullColumnHack:沒有插入字段的默認值
          * values:要添加的數據,ContentValues的對象,通過put放數據,鍵為字段名,值為插入值
          * 返回值:插入數據的行號id,返回-1表插入數據失敗
          * */

        for (int i = 0; i < 20; i++) {
            ContentValues values=new ContentValues();
            values.put("name", "apple"+i);
            values.put("price", "5.5"+i);
            long rowId = db.insert(TABLE_NAME, null, values);
            if (rowId==-1) {
                Log.e("info", "插入數據失敗==="+i);
            }
        }
    }
刪除數據
    private void delectApi() {
        /*
         * db.delete(table, whereClause, whereArgs)
         * table: 表名
         * whereClause: sql語句中的where後面的賽選條件(不寫關鍵字where)
         * whereArgs:   如果賽選條件有?,這就是賽選條件的具體值
         * 返回值:刪除的行數,若等於0,表示刪除失敗
         * 注:如果沒有where賽選條件whereClause和whereArgs為 null
         * */
        //db.execSQL("delete from table food where name =? ",new String[]{"apple1"});等價
        int rows = db.delete(TABLE_NAME, "name = ? ", new String[]{"apple1"});
        if (rows>0) {
            Toast.makeText(this, "刪除成功,共刪除"+rows+"條數據!", 1).show();
        }else {
            Toast.makeText(this, "刪除失敗", 1).show();
        }

    }
修改數據
    private void updataApi(){
        /*如果沒有賽選條件,最後兩個可以填 null
         * db.update(table, values, whereClause, whereArgs);
         * table:表名
         * values:  要修改的數據,ContentValues的對象,通過put放數據,鍵為字段名,值為插入值
         * whereClause: sql語句中的where後面的賽選條件(不寫關鍵字where)
         * whereArgs:   如果賽選條件有?,這就是賽選條件的具體值,為String 的數組
         * 返回值:  修改數據受影響的行數,
         * */
//      db.execSQL("update food set price =100.0 where _id =15 ");
        ContentValues values=new ContentValues();
        values.put("price", "100.0");
        int rows = db.update(TABLE_NAME, values, " _id = ? ", new String[]{"15"});
        if (rows>0) {
            Toast.makeText(this, "修改成功,共修改"+rows+"條數據!", 1).show();
        }else {
            Toast.makeText(this, "沒有修改到數據", 1).show();
        }
    }
查詢數據
    private void selectApi() {
        /*sql="select name,price from food where name = apple1 "
         * db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
         * table:   表名
         * columns: 要查詢的字段,String的數組
         * selection:   賽選條件的where語句(不寫關鍵字where了)
         * selectionArgs:   如果賽選條件有,這裡為賽選條件的值
         * 以下三個參數沒有就填null
         * groupBy:  分組
         * having:   分組的條件
         * orderBy:   排序方式
         * */

    /*sql=" select name,price,_id from limit "0,10" "
     db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, 
     limit);分頁查詢使用,eg: "1,10"  1:代表開始查詢的位置,10:查詢的數量,結果就是從1位置開始查詢,查詢出10條數據
* */
        cursor=db.query(TABLE_NAME,
                   new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
        Cursor cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
                "name=?", new String[]{"apple2"}, null, null, null);
        //  相當於  select * from food
        cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
                null, null, null, null, null);
        while(cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String price = cursor.getString(cursor.getColumnIndex("price"));
            int id = cursor.getInt(cursor.getColumnIndex("_id"));
            textView.append(name+",="+price+",="+id+"=======\n");
        }
    }
分頁查詢
/*sql=" select name,price,_id from limit "0,10" "
     db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, 
     limit);分頁查詢使用,eg: "1,10"  1:代表開始查詢的位置,10:查詢的數量,結果就是從1位置開始查詢,查詢出10條數據
* */
        cursor=db.query(TABLE_NAME,
                   new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
數據庫適配器SimpleCursorAdapter
      /*數據的適配器,不用創建java bean對象,不用自定義適配器
         * new SimpleCursorAdapter(context, 上下文
         * layout:  每個item要展示的布局文件
         * c:   數據源,查詢數據庫的時候得到的cursor游標
         * from:    數據獲取的來源,表的字段數組
         * to:      數據的去處,item布局的控件id的數組
         * flags:   標記,
           標記有CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER : 2 和 CursorAdapter.FLAG_AUTO_REQUERY : 1
         * 交換數據源,可以換新的數據源:simpleCursorAdapter.swapCursor(cursor);
         * )*/
        simpleCursorAdapter=new SimpleCursorAdapter(this,
                R.layout.item,
                null, new String[]{"_id","name","price"}, 
                new int[]{R.id.item_id,R.id.item_name,R.id.item_price},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        listView.setAdapter(simpleCursorAdapter);
        // 交換數據源,可以換新的數據源
        //simpleCursorAdapter.swapCursor(cursor);
        simpleCursorAdapter.changeCursor(cursor);//也是交換數據源,會自動關閉老的cursor,推薦使用

Cursor類
    getColumnCount():獲取到查詢後表中的字段列數
    getCount():行數
    getColumnIndex(String columnName):獲取到指定字段名的下標位置
    getColumnName(int columnIndex):根據列號得到列名
    getType(int columnIndex)    :得到指定列數的類型
        FIELD_TYPE_NULL        :null
        FIELD_TYPE_INTEGER    :integer
        FIELD_TYPE_FLOAT        :float
        FIELD_TYPE_STRING        :string
        FIELD_TYPE_BLOB        :blob
    getLong(int columnIndex)    :得到指定列號的long數據
    getString(int columnIndex)    :得到指定列號的string數據
    isNull(int columnIndex)    :判斷指定列號是否為null
    boolean moveToNext()    :移動游標到下一行,若下行有數據返回true
數據庫事務
4 數據庫的事務    
    事務: 執行多條sql語句,要麼同時執行成功,要麼同時執行失敗,不能有的成功,有的失敗
    銀行轉賬
    //點擊按鈕執行該方法
    public void transtation(View v){
        //1.創建一個幫助類的對象
        BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
        //2.調用數據庫幫助類對象的getReadableDatabase創建數據庫,初始化表數據,獲取一個SqliteDatabase對象去做轉賬(sql語句)
        SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
        //3.轉賬,將李四的錢減200,張三加200
        db.beginTransaction();//開啟一個數據庫事務
        try {
            db.execSQL("update account set money= money-200 where name=?",new String[]{"李四"});
            int i = 100/0;//模擬一個異常
            db.execSQL("update account set money= money+200 where name=?",new String[]{"張三"});
            db.setTransactionSuccessful();//標記事務中的sql語句全部成功執行
        } finally {
            db.endTransaction();//判斷事務的標記是否成功,如果不成功,回滾錯誤之前執行的sql語句 
        }
    }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved