停更了一天,I'm back again~~當我們需要操作大量的數據時,我們首先想到的當然是數據庫,因為可以通過簡單的語句實現數據的增刪改查,在Android中,我們不使用SQL或者ORACLE,我們使用SQLite,因為它占用資源更少,而語句格式與SQL語句一樣。
首先,我們來在Android中實現數據庫的創建與增刪改查,引用數據庫的類時,不再繼承常用的Activity類,而是繼承Android中的SQLiteOpenHelper,創建一個構造方法,四個參數分別是(Context context, String name, SQLiteDatabase.CursorFactory factory,int version),下面我們來分別解釋一下這四個參數,context代表上下文環境,大多情況是上下文環境就是activity,name是數據庫的名字,通常我們寫成"xxx.db",這樣方便知道我們創建的是一個數據庫,cursor代表指針,在默認為null時,它表示初始為-1,然后依次指向數據庫的每一行,我們可以利用cursor來掃描數據庫,有條件的掃描就是查找,version代表版本號,只要設置大於等於1的值即可。在數據庫類中一定要調用兩個方法,即onCreate()與onUpdate()方法,傳進來的參數都是數據庫對象,它們分別在數據庫被創建與數據庫被更新時調用,在數據庫被創建時創建表,直接調用執行數據庫語句方法execSQL(String),代碼如下:
package com.administrator.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.Settings; /** * Created by Administrator on 2016/7/22. */ public class MyOpenHelper extends SQLiteOpenHelper { //構造方法,new時會調用,cursor:封裝數據庫查詢時返回的數據,初始為-1.依次向下讀取下一行數據,null使用默認游標 public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); } //數據庫創建時,此方法會調用 //創建數據庫的同時創建表 @Override public void onCreate(SQLiteDatabase db) { String sql="create table student(number char(4) primary key,name char(4),age char(1))"; db.execSQL(sql); } //數據庫升級時,此方法會調用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("數據庫被升級了"); } }
下面我們用單元測試方法來實現一下數據庫的增刪改查,寫在ApplicationTest中,首先我們定義一個MyOpenHelper的對象,此時我們在測試,沒有任何前台任務,所以此時沒有正在執行的Activity,Android為我們提供了getContext()方法,用來在沒有上下文環境中為我們創建一個虛擬的上下文環境。接下來我們調用getReadableDatabase()來創建或打開一個數據庫(如果沒有,我們就創建一個數據庫,如果有,我們就打開這個數據庫),對數據的增刪改操作,就是創建好一個數據庫后執行相應的SQL語句,最后關閉數據庫。代碼如下:
package com.administrator.sqlite; import android.app.Application; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.test.ApplicationTestCase; /** * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> */ public class ApplicationTest extends ApplicationTestCase<Application> { public ApplicationTest() { super(Application.class); } public void testInsert(){ MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); SQLiteDatabase db=moh.getReadableDatabase(); db.execSQL("insert into student values(?,?,?)",new Object[]{"1234","Lily","19"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1235","Bob","20"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1236","Amy","18"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1237","Tom","21"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1238","Alice","18"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1239","Grace","20"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1240","Henry","23"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1241","David","40"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1242","Soada","17"}); db.close(); } public void testDelete(){ MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); SQLiteDatabase db=moh.getReadableDatabase(); db.execSQL("delete from student where number=?",new Object[]{1241}); db.close(); } public void testUpdate(){ MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); SQLiteDatabase db=moh.getReadableDatabase(); db.execSQL("update student set number=? where name=?",new Object[]{"1314","Soada"}); db.close(); } }
對於對數據庫的查找操作,我們需要利用游標實現按行掃描一遍數據庫,並取出符合要求的數據,我們調用rawQuery方法,第一個參數為select語句;第二個參數為select語句中占位符參數的值,如果select語句沒有使用占位符(也就是where語句),該參數可以設置為null,返回一個游標Cursor。掃描方法是:如果游標指向的下一行不為空,就獲取每行每個屬性的值,從而實現多行掃描並得到整個數據庫的數據。我們還要強調一下getString()方法傳遞的參數是一個整型的索引值,它代表該屬性的索引值,第一個為0,以此類推;但我們在不明確數據庫結構的情況下,很難知道確切的值,因此我們通常調用getColumnIndex方法。代碼如下:
1 public void testSelect(){ 2 MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); 3 SQLiteDatabase db=moh.getReadableDatabase(); 4 Cursor cursor=db.rawQuery("select * from student",null); 5 while(cursor.moveToNext()){ 6 //獲取下一行數據 7 String number = cursor.getString(cursor.getColumnIndex("number")); 8 String name = cursor.getString(cursor.getColumnIndex("name")); 9 String age = cursor.getString(cursor.getColumnIndex("age")); 10 System.out.println(number+";"+name+";"+age); 11 db.close(); 12 }
下面我們來逐一測試一下:
增加若干條數據進入數據庫student:
刪除一條記錄:刪除number為1241的記錄
修改一條記錄:Soada的number改為1314
我們掌握了在Android中使用SQLite對數據的增刪改查,下節我們要實現的是將數據庫的每條記錄依次顯示到屏幕上。