SQLite學習和使用

來源:互聯網
上載者:User

標籤:返回   執行   style   rac   content   actions   efault   參數   資料庫   

建立資料庫並建立表格1.建立MyDatabaseHelper繼承於SQLiteOpenHelper(抽象類別,必須實現onCreate()和onUpgrade()方法)
2.把資料庫建表指令弄成一個字串CREATE_BOOK常量,並在onCreate()函數中執行建表
public class MyDatabaseHelper extends SQLiteOpenHelper {    //把資料庫建表指令弄成一個字串CREATE_BOOK常量    public static final String CREATE_BOOK = "create table book ("            + "id integer primary key autoincrement, "            + "author text, "            + "price real, "            + "pages integer, "            + "name text)";    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context,name,factory,version);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);//執行建表        Log.d(TAG,"資料庫初始化完成");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }    }
3.在MianActivity()中建立資料庫
    private MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);    //建立一個MyDatabaseHelper對象,上下文;資料庫名;第三個參數允許我們在查詢資料的時候返回一個自訂的 Cursor,一般都是傳入 null;資料庫版本號碼    dbHelper.getWritableDatabase();

 

升級資料庫方法1(覆蓋式)需 求:增加一個新的表格,Category

  由於資料庫BookStore.db已經存在,onCreate()方法不會再次執行,直接在onCreate()方法中,添加table不能被更新。

解決方案:使用onUpgrade()方法更新資料庫

添加表格常量;在onCreate()方法中建表;在upGreate()方法中刪去存在表格,並重新執行onCreate()方法;在引用資料庫時更改資料庫版本號碼

    public class MyDatabaseHelper extends SQLiteOpenHelper {        //把資料庫建表指令弄成一個字串CREATE_BOOK常量        public static final String CREATE_BOOK = "create table book ("                + "id integer primary key autoincrement, "                + "author text, "                + "price real, "                + "pages integer, "                + "name text)";        //integer 表示整型,real 表示浮點型,text 表示文本類型,blob 表示二進位類型。另外,上述建表語句中我們還        //使用了 primary key 將 id 列設為主鍵,並用 autoincrement 關鍵字表示 id 列是自增長的        public static final String CREATE_CATEGORY = "create table category("                + "id integer primary key autoincrement, "                + "category_name text, "                + "category_code integer)";        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {            super(context,name,factory,version);        }        @Override        public void onCreate(SQLiteDatabase db) {            db.execSQL(CREATE_BOOK);//執行建表            db.execSQL(CREATE_CATEGORY);            Log.d(TAG,"資料庫初始化完成");        }        //當檢測到資料庫版本變化,就會執行onUpgrade()中的代碼        @Override        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {            //調用SQL語句,若存在表格則刪去,之後在重新調用onCreate()方法            db.execSQL("drop table if exists Book");            db.execSQL("drop table if exists Category");            onCreate(db);        }    }
升級資料庫方法2(追加式)需 求:根據所需變更資料庫,增加一個新的表格,Category

  由於覆蓋式更新資料庫的方法會重設資料庫,導致使用者資料丟失,不能在產品中使用


解決方案:為每一個版本號碼賦予它各自改變的內容,然後在onUpgrade()方法中對當前資料庫的版本號碼進行判斷,再執行相應的改變就可以了
    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        //調用SQL語句,若存在表格則刪去,之後在重新調用onCreate()方法        /**         * 注釋時間:20170117         * 代碼作用:覆蓋式更新資料庫,刪除之前的資料庫再建立庫         * 注釋原因:學習新的資料庫更新方法        db.execSQL("drop table if exists Book");        db.execSQL("drop table if exists Category");        onCreate(db);         */        switch (newVersion)        {            case 2:db.execSQL(CREATE_CATEGORY);                //!!!注意,無break;            case 3:db.execSQL("alter table Book add column category_id integer");                //!!!注意,無break;                //因為無論覆蓋哪一個版本安裝,都需要安裝其他更新,從第二版安裝第三版時,只需要更新case3,確保資料庫最新                Log.d(TAG,"第3版資料庫更新成功");                break;            default:                Log.d(TAG,"資料庫更新失敗");                break;        }    }

 

增刪改查操作(SQL語句操作)

對資料進行的操作也就無非四種,即CRUD。其中 C 代表添加(Create) ,R 代表查詢(Retrieve) ,U 代表更新(Update) ,D 代表刪除(Delete)

SQLiteDatabase db = dbBookStoreHelper.getWritableDatabase();    //建立兩個資料    db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });    db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });     //查詢所有資料    db.rawQuery("select * from Book", null);       //把《The Da Vinci Code》這本書改成10.99    db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99","The Da Vinci Code" });      //把500頁以上的書刪了    db.execSQL("delete from Book where pages > ?", new String[] { "500" });
增刪改查操作(Android文法操作)
  • 增加資料

insert()方法,1.表名;2.未指定添加資料的情況下給某些可為空白的列自動賦值 NULL;3.ContentValues 對象,它提供了一系列的 put()方法重載,用於向 ContentValues 中添加資料,只需要將表中的每個列名以及相應的待添加資料傳入即可

//!!!先組裝資料,再插入資料SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();// 開始組裝第一條資料values.put("name", "The Da Vinci Code");values.put("author", "Dan Brown");values.put("pages", 454);values.put("price", 16.96);db.insert("Book", null, values); // 插入第一條資料values.clear();// 開始組裝第二條資料values.put("name", "The Lost Symbol");values.put("author", "Dan Brown");values.put("pages", 510);values.put("price", 19.95);db.insert("Book", null, values); // 插入第二條資料
  • 更改資料

update()方法,1.表名;2.ContentValues 對象,要把更新資料在這裡組裝進去;第三、第四個參數用於去約束更新某一行或某幾行中的資料,不指定的話預設就是更新所有行

SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("price", 10.99);db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" });values.clean();
  • 刪除資料

delete()方法,1.表名;第二、第三個參數用於去約束刪除某一行或某幾行的資料,不指定的話預設就是刪除所有行

db.delete("Book","pages > ?",new String[] {"300"});
  • 查詢資料

query()方法,1.表名;2.指定去查詢哪幾列,如果不指定則預設查詢所有列;3.第三、第四個參數用於去約束查詢某一行或某幾行的資料,不指定則預設是查詢所有行的資料;5.指定需要去 group by 的列,不指定則表示不對查詢結果進行 group by 操作;6. group by 之後的資料進行進一步的過濾,不指定則表示不進行過濾;7,指定查詢結果的排序方式,不指定則表示使用預設的排序方式。

 

query()方法參數 對應 SQL 部分   描述
table  from table_name  指定查詢的表名
columns  select column1, column2  指定查詢的列名
selection  where column = value  指定 where 的約束條件
selectionArgs  -  為 where 中的預留位置提供具體的值
groupBy  group by column  指定需要 group by 的列
having  having column = value  對 group by 後的結果進一步約束
orderBy  order by column1, column2  指定查詢結果的排序方式

 

 

Cursor cursor = db.query("Book",null,"1",null,null,null,null);    if (cursor != null)    {        if(cursor.moveToFirst())        {            do {//直到型迴圈                String name = cursor.getString(cursor.getColumnIndex("name"));                String author = cursor.getString(cursor.getColumnIndex("author"));                Double price = cursor.getDouble(cursor.getColumnIndex("price"));                int pages = cursor.getInt(cursor.getColumnIndex("pages"));                Log.d(TAG,"name = " + name);                Log.d(TAG,"author = " + author);                Log.d(TAG,"price = " + price);                Log.d(TAG,"pages = " + pages);            }while (cursor.moveToNext());        }    }    cursor.close();
 使用事務Transaction

事情要有始有終,就像轉賬,錢沒到達對方賬戶就會退回原始賬戶


需 求:刪除舊的資料庫,更換新的資料庫解決方案:使用beginTransaction,setTransactionSuccessful,endTransaction三個來監控事務的執行,一旦執行失敗,返回原始的資料庫
    db.beginTransaction();//開始事務    try {        db.delete("Book", null, null);        if (true) {            // 在這裏手動拋出一個異常,讓事務失敗            throw new NullPointerException();        }        db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",                new String[]{"馬克思主義2", "中國**黨", "1000", "100.00"});//居然和諧        db.setTransactionSuccessful(); // 事務已經執行成功    } catch (Exception e) {        e.printStackTrace();    } finally {        db.endTransaction(); // 結束事務    }

 

SQLite學習和使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.