標籤:返回 執行 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學習和使用