1. 程式人生 > >建立SQLite資料庫並實現增刪改查

建立SQLite資料庫並實現增刪改查

1)、除了可以使用檔案或SharedPreferences儲存資料,還可以選擇使用SQLite資料庫儲存資料。

2)、在Android平臺上,集成了一個嵌入式關係型資料庫—SQLiteSQLite3支援NULLINTEGERREAL(浮點數字)、TEXT(字串文字)BLOB(二進位制物件)資料型別,雖然它支援的型別只有五種,但實際上sqlite3也接受varchar(n)char(n)decimal(p,s)等資料型別,只不過在運算或儲存時會轉成對應的五種資料型別。 SQLite最大的特點是你可以把各種型別的資料儲存到任何欄位中,而不用關心欄位宣告的資料型別是什麼。例如:可以在Integer

型別的欄位中存放字串,或者在布林型欄位中存放浮點數,或者在字元型欄位中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能儲存64位整數, 當向這種欄位儲存除整數以外的資料時,將會產生錯誤。 另外, SQLite 在解析CREATE TABLE 語句時,會忽略 CREATE TABLE 語句中跟在欄位名後面的資料型別資訊,如下面語句會忽略name欄位的型別資訊:

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

SQLite可以解析大部分標準SQL

語句,如:

查詢語句:select * from 表名 where 條件子句 group by 分組字句 having ... order by 排序子句

如:select * from person

        select * from person order by id desc

        select name from person group by name having count(*)>1

分頁SQLmysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄

select * from Account limit 5 offset 3

 或者 select * from Account limit 3,5

插入語句:insert into 表名(欄位列表) values(值列表)。如: insert into person(name, age) values(‘趙靈兒’,3)

更新語句:update 表名 set 欄位名=值 where 條件子句。如:update person set name=‘趙靈兒‘ where id=10

刪除語句:delete from 表名 where 條件子句。如:delete from person  where id=10

3)、SqlLite資料庫與桌面級的資料庫不同,回顧我們做java EE的時候,建資料庫與建表都是在本機完成的,但是在做安卓端開發的時候,我們不可能將所有使用者的手機都拿過來建資料庫。因此她提供一個類SQLiteOpenHelper,我們必須去繼承她才能使用。她裡面有兩個方法,getReadableDatabase()或者getWritableDatabase(),當用戶第一次實用軟體時,呼叫這兩個方法的任意一個就會自動建立資料庫。

4)、新建安卓工程,應用名為資料庫應用,工程名為DB。新建一個類DBOpenHelper繼承SQLiteOpenHelper

5)、需要生成父類構造器。Super(context,string,string,string):第一個引數代表傳入的上下文物件,第二個引數傳入要生成的資料庫的名稱,如果名稱需要字尾,用.連線,第三個引數是遊標工廠,用來產生遊標,作用是對查詢的結果集進行隨機訪問,傳入null代表使用系統預設的遊標物件,第四個引數是資料庫的版本,一般版本號標為1.

6)、類中有兩個方法,一個是onCreate(SQLiteDatabase db)方法,她會在資料庫第一次被建立的時候呼叫,在這個方法裡特別適合生成應用需要的資料庫表。

Db.execSQL(“CREATE TABLE person(personid integer primary key autoincrement,name varchar(20))”)

(7)、當表結構需要修改升級的時候,應該修改版本號,從而觸發upgrade()方法。

例如額外新增欄位:db.execSQL(“ALTER TABLE person ADD phone VARCHAR(12) NULL”)

(8)、下面進行測試:呼叫read或者write方法,當執行測試方法後,建立的資料庫檔案會被建立在當前應用包下的databases資料夾下

9)、在安卓中操作資料庫無需載入驅動,因為安卓系統已指定是sqlLIte資料庫 。

10)、加入資料庫中欄位的javaBean屬性,編寫一個業務類,完成增刪改查,點選完成。

查詢所有結果需要使用分頁sql語句,分頁sql語句需要兩個引數,第一個是offset,第二個是查詢多少記錄(maxLength)。

Public ListfindScrolledData(int offset,int maxLength){

}

(11)、要對資料庫進行操作,首先要得到資料庫操作例項,可以通過SqLiteDatabase這個類來完成,然後在dbOpenHelper物件中傳入上下文物件,接著呼叫dbopenHelper物件的getWritableDataBase()方法得到操作例項。在save()方法中,接著呼叫SqlDataBaseexecSQL()方法執行sql語句。其他方法同理

12)、SQLiteDatabase還專門提供了對應於新增、刪除、更新、查詢的操作方法:insert()delete()update()query() 。這些方法實際上是給那些不太瞭解SQL語法的菜鳥使用的,對於熟悉SQL語法的程式設計師而言,直接使用execSQL()rawQuery()方法執行SQL語句就能完成資料的新增、刪除、更新、查詢操作。

Insert()方法用於新增資料,各個欄位的資料使用ContentValues進行存放。ContentValues類似於MAP,相對於MAP,它提供了存取資料對應的put(String key, Xxx value)getAsXxx(String key)方法,  key為欄位名稱,value為欄位值,Xxx指的是各種常用的資料型別,如:StringInteger等。

SQLiteDatabase db = databaseHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("name", "龍幽");

values.put("age", 4);

long rowid = db.insert(person, null, values);//返回新添記錄的行號,與主鍵id無關

不管第三個引數是否包含資料,執行Insert()方法必然會新增一條記錄,如果第三個引數為空,會新增一條除主鍵之外其他欄位值為Null的記錄。Insert()方法內部實際上通過構造insert SQL語句完成資料的新增,Insert()方法的第二個引數用於指定空值欄位的名稱,相信大家對該引數會感到疑惑,該引數的作用是什麼?是這樣的:如果第三個引數valuesNull或者元素個數為0, 由於Insert()方法要求必須新增一條除了主鍵之外其它欄位為Null值的記錄,為了滿足SQL語法的需要, insert語句必須給定一個欄位名,如:insert into person(name) values(NULL),倘若不給定欄位名 , insert語句就成了這樣:insert into person() values(),顯然這不滿足標準SQL的語法。對於欄位名,建議使用主鍵之外的欄位,如果使用了INTEGER型別的主鍵欄位,執行類似insert into person(personid) values(NULL)insert語句後,該主鍵欄位值也不會為NULL。如果第三個引數values 不為Null並且元素的個數大於0 ,可以把第二個引數設定為null

原始碼:

public class Person implements Serializable{

    private Integer id;

    private String name;

    private String phone;

public class PersonService {

    private DBOpenHelper openHelper; 

    public PersonService(Context context) {

         this.openHelper =new DBOpenHelper(context);

    }

    public void save(Person person){

         SQLiteDatabase db=openHelper.getWritableDatabase();

         db.execSQL("INSERT INTO person(name,phone) VALUES(?,?)",new Object[]{person.getName(),person.getPhone()});

    }

    public void delete(Integer id){

         SQLiteDatabase db=openHelper.getWritableDatabase();

         db.execSQL("DELETE FROM person where persionid=?", new Object[]{id});

    }

    public void update(Person person){

         SQLiteDatabase db=openHelper.getWritableDatabase();

         db.execSQL("UPDATE person set name=?,phone=? where persionid=?"

                  ,new Object[]{person.getName(),person.getPhone(),person.getId()});

    }

    public Person find(Integer id){

         SQLiteDatabase db=openHelper.getReadableDatabase();

         Cursor cursor=db.rawQuery("SELECT * FROM person where persionid=?", new String[]{id.toString()});//執行查詢語句,返回的是一個工廠遊標Cursor物件

         boolean result=cursor.moveToFirst();//將指標移到第一條記錄

         if(result=true){

             int persionid=cursor.getInt(cursor.getColumnIndex("persionid"));

             String name=cursor.getString(cursor.getColumnIndex("name"));

             String phone=cursor.getString(cursor.getColumnIndex("phone"));

//           Person person=new Person();

//           person.setId(persionid);

//           person.setName(name);

//           person.setPhone(phone);

//           return person;

             return new Person(persionid, name, phone);

         }

         cursor.close();

         return null;

    }

    public List getScrollData(int offset,int maxResult){

         Listlist=new ArrayList();

         SQLiteDatabase db=openHelper.getReadableDatabase();

         Cursor cursor=db.rawQuery("SELECT * FROM person order by persionid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)});

         while(cursor.moveToNext()){//java EE中的ResultSet.next()很相似

             int personid=cursor.getInt(cursor.getColumnIndex("persionid"));

             String name=cursor.getString(cursor.getColumnIndex("name"));

             String phone=cursor.getString(cursor.getCo