使用嵌入式關係型SQLite資料庫儲存資料

來源:互聯網
上載者:User

標籤: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;}}

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.