標籤:des android blog java 使用 os io strong
在Android平台上,整合了一個嵌入式關係型資料庫—SQLite,SQLite3支援 NULL、INTEGER、REAL(浮點數字)、TEXT(字串文本)和BLOB(二進位對象)資料類型,雖然它支援的類型只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等資料類型,只不過在運算或儲存時會轉成對應的五種資料類型。 SQLite最大的特點是你可以把各種類型的資料儲存到任何欄位中,而不用關心欄位聲明的資料類型是什麼。例如:可以在Integer類型的欄位中存放字串,或者在布爾型欄位中存放浮點數,或者在字元型欄位中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能儲存64位整數, 當向這種欄位儲存除整數以外的資料時,將會產生錯誤。 另外,在編寫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分頁SQL與mysql類似,下面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 擷取添加記錄後自增長的ID值:SELECT last_insert_rowid() 使用SQLiteOpenHelper擷取用於操作資料庫的SQLiteDatabase執行個體 這是DBOpenHelper 類繼承SQLiteOpenHelper
package com.example.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper {public DBOpenHelper(Context context) {super(context, "example.db", null, 2);//在<包>/databases/下}@Overridepublic void onCreate(SQLiteDatabase db) {//資料庫每次建立是被調用db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {//資料庫版本發生變化是被調用db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列// DROP TABLE IF EXISTS person 刪除表}}
下面程式碼完成增刪改查等操作
package com.example.service;import java.util.ArrayList;import java.util.List;import com.example.domain.Person;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class PersonService {private DBOpenHelper dbOpenHelper;public PersonService(Context context) {this.dbOpenHelper = new DBOpenHelper(context);}/** * 新增記錄 * @param person */public void save(Person person){SQLiteDatabase db=dbOpenHelper.getWritableDatabase();db.execSQL("insert into person(name, phone) values(?,?)", new Object[]{person.getName(),person.getPhone()});}/** * 刪除記錄 * @param person */public void delete(Integer id){SQLiteDatabase db=dbOpenHelper.getWritableDatabase();db.execSQL("delete from person where personid=?", new Object[]{id});}/** * 更新記錄 * @param person */public void update(Person person){SQLiteDatabase db=dbOpenHelper.getWritableDatabase();db.execSQL("update person set name=? ,phone=? where personid=?", new Object[]{person.getName(),person.getPhone(),person.getId()});}/** * 尋找記錄 * @param id 記錄ID * @return */public Person find(Integer id){SQLiteDatabase db=dbOpenHelper.getReadableDatabase();Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{id.toString()});if(cursor.moveToFirst()){int personid=cursor.getInt(cursor.getColumnIndex("personid"));String name=cursor.getString(cursor.getColumnIndex("name"));String phone=cursor.getString(cursor.getColumnIndex("phone"));return new Person(personid, name, phone);}cursor.close();return null;}/** * 分頁擷取記錄 * @param offset 跳過前面多少條記錄 * @param maxResult 每頁顯示多少條記錄 * @return */public List<Person> getScrollData(int offset,int maxResult){SQLiteDatabase db=dbOpenHelper.getReadableDatabase();List<Person> persons=new ArrayList<Person>();Cursor cursor=db.rawQuery("select * from person order by personid asc limit?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)});while(cursor.moveToNext()){int personid=cursor.getInt(cursor.getColumnIndex("personid"));String name=cursor.getString(cursor.getColumnIndex("name"));String phone=cursor.getString(cursor.getColumnIndex("phone"));persons.add(new Person(personid, name, phone));}cursor.close();return persons;}/** * 擷取記錄總條數 * @return */public long getCount(){SQLiteDatabase db=dbOpenHelper.getReadableDatabase();Cursor cursor=db.rawQuery("select count(*) from person ", null);cursor.moveToFirst();long result=cursor.getLong(0);cursor.close();return result;}}
也可以使用系統給的insert、delete、udate等方法實現增刪改查
1、Insert()方法用於添加資料,各個欄位的資料使用ContentValues進行存放。 ContentValues類似於MAP,相對於MAP,它提供了存取資料對應的put(String key, Xxx value)和getAsXxx(String key)方法, key為欄位名稱,value為欄位值,Xxx指的是各種常用的資料類型,如:String、Integer等。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的記錄。2、delete()方法的使用:SQLiteDatabase db = databaseHelper.getWritableDatabase();db.delete("person", "personid<?", new String[]{"2"});db.close();上面代碼用於從person表中刪除personid小於2的記錄。3、update()方法的使用:SQLiteDatabase db = databaseHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put(“name”, “傳智播客”);//key為欄位名,value為值db.update("person", values, "personid=?", new String[]{"1"});db.close();上面代碼用於把person表中personid等於1的記錄的name欄位的值改為“傳智播客”。4、query()方法實際上是把select語句拆分成了若干個組成部分,然後作為方法的輸入參數:SQLiteDatabase db = databaseHelper.getWritableDatabase();Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%傳智%"}, null, null, "personid desc", "1,2");while (cursor.moveToNext()) { int personid = cursor.getInt(0); //擷取第一列的值,第一列的索引從0開始 String name = cursor.getString(1);//擷取第二列的值 int age = cursor.getInt(2);//擷取第三列的值}cursor.close();db.close();上面代碼用於從person表中尋找name欄位含有“傳智”的記錄,匹配的記錄按personid降序排序,對排序後的結果略過第一條記錄,只擷取2條記錄。query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各參數的含義:
table:表名。相當於select語句from關鍵字後面的部分。如果是多表聯集查詢,可以用逗號將兩個表名分開。
columns:要查詢出來的列名。相當於select語句select關鍵字後面的部分。
selection:查詢條件子句,相當於select語句where關鍵字後面的部分,在條件子句允許使用預留位置“?”
selectionArgs:對應於selection語句中預留位置的值,值在數組中的位置與預留位置在語句中的位置必須一致,否則就會有異常。
groupBy:相當於select語句group by關鍵字後面的部分
having:相當於select語句having關鍵字後面的部分
orderBy:相當於select語句order by關鍵字後面的部分,如:personid desc, age asc;
limit:指定位移量和擷取的記錄數,相當於select語句limit關鍵字後面的部分。
package com.example.service;import java.util.ArrayList;import java.util.List;import com.example.domain.Person;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class OtherPersonService {private DBOpenHelper dbOpenHelper;public OtherPersonService(Context context) {this.dbOpenHelper = new DBOpenHelper(context);}/** * 新增記錄 * @param person */public void save(Person person){SQLiteDatabase db=dbOpenHelper.getWritableDatabase();ContentValues values=new ContentValues();values.put("name", person.getName());values.put("phone", person.getPhone());db.insert("person", null, values);}/** * 刪除記錄 * @param person */public void delete(Integer id){SQLiteDatabase db=dbOpenHelper.getWritableDatabase();db.delete("person", "personid=?",new String[]{id.toString()} );}/** * 更新記錄 * @param person */public void update(Person person){SQLiteDatabase db=dbOpenHelper.getWritableDatabase();ContentValues values=new ContentValues();values.put("name", person.getName());values.put("phone", person.getPhone());db.update("person", values, "personid=?", new String[]{person.getId().toString()});}/** * 尋找記錄 * @param id 記錄ID * @return */public Person find(Integer id){SQLiteDatabase db=dbOpenHelper.getReadableDatabase();Cursor cursor=db.query("person", null, "personid=?", new String[]{id.toString()}, null, null, null);if(cursor.moveToFirst()){int personid=cursor.getInt(cursor.getColumnIndex("personid"));String name=cursor.getString(cursor.getColumnIndex("name"));String phone=cursor.getString(cursor.getColumnIndex("phone"));return new Person(personid, name, phone);}cursor.close();return null;}/** * 分頁擷取記錄 * @param offset 跳過前面多少條記錄 * @param maxResult 每頁顯示多少條記錄 * @return */public List<Person> getScrollData(int offset,int maxResult){SQLiteDatabase db=dbOpenHelper.getReadableDatabase();List<Person> persons=new ArrayList<Person>();Cursor cursor=db.query("person", null, null, null,null,null, "personid asc", offset+","+maxResult);while(cursor.moveToNext()){int personid=cursor.getInt(cursor.getColumnIndex("personid"));String name=cursor.getString(cursor.getColumnIndex("name"));String phone=cursor.getString(cursor.getColumnIndex("phone"));persons.add(new Person(personid, name, phone));}cursor.close();return persons;}/** * 擷取記錄總條數 * @return */public long getCount(){SQLiteDatabase db=dbOpenHelper.getReadableDatabase();Cursor cursor=db.query("person", new String[]{"count(*)"}, null, null, null, null, null);cursor.moveToFirst();long result=cursor.getLong(0);cursor.close();return result;}}