Android之SQlite存儲

Android之SQlite存儲

 

使用嵌入式關係型SQLite數據庫存儲數據

除了可以使用文件或SharedPreferences存儲數據,還可以選擇使用SQLite數據庫存儲數據。

在Android平臺上,集成了一個嵌入式關係型數據庫—SQLite,

1、SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型,雖然它支持的類型雖然只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等數據類型,只不過在運算或保存時會轉成對應的五種數據類型。

2、SQLite最大的特點是你可以保存任何類型的數據到任何字段中,無論這列聲明的數據類型是什麼。例如:可以在Integer字段中存放字符串,或者在布爾型字段中存放浮點數,或者在字符型字段中存放日期型值。

3、但有一種情況例外:定義爲INTEGER PRIMARY KEY的字段只能存儲64位整數, 當向這種字段中保存除整數以外的數據時,將會產生錯誤。

4、另外, 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

分頁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

使用SQLiteDatabase操作SQLite數據庫
Android提供了一個名爲SQLiteDatabase的類,該類封裝了一些操作數據庫的API。
可以調用SQLiteDatabase的靜態方法:
public static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags)
flags參數可以是 OPEN_READWRITE, OPEN_READONLY ,CREATE_IF_NECESSARY, NO_LOCALIZED_COLLATORS四個的一個或多個(多個模式組合用|隔離).
public static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory)
public static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)
來打開文件系統中位於絕對路徑path的數據庫。
還可以通過Context對象調用
public abstract SQLiteDatabase openOrCreateDatabase(String name,int mode,SQLiteDatabase.CursorFactory factory)直接在私有數據庫目錄創建或打開一個名爲name的數據庫,
注意:mode只的是MODE_PRIVATE , MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE。
Context還有:
public abstract String[] databaseList();//返回私有數據庫目錄所有數據庫名字
public abstract boolean deleteDatabase(String name);//刪除私有數據庫目錄內文件名爲name的數據庫。
除了在文件系統中創建SQLite數據庫,android還支持SQLite內存數據庫。在某些需要臨時創建數據庫,並且對操作速率相對要求高的情況下,SQLite內存數據庫就發揮作用了,用SQLiteDatabase的靜態方法:
public static SQLiteDatabase create(SQLiteDatabase.CursorFactory factory)
來創建,創建失敗返回null。
最後記住,不管用何種方式打開了數據庫,獲得的SQLite對象不再使用時,都要調用close()來關閉打開的數據庫,否則拋出IllegalStateException異常。
使用SQLiteDatabase對象可以完成對數據進行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱爲CRUD)。對SQLiteDatabase的學習,我們應該重點掌握execSQL()和rawQuery()方法。 execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行爲的SQL語句; rawQuery()方法可以執行select語句。
execSQL()方法的使用例子:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('傳智播客', 4)");
db.close();
執行上面SQL語句會往person表中添加進一條記錄,在實際應用中, 語句中的“傳智播客”這些參數值應該由用戶輸入界面提供,如果把用戶輸入的內容原樣組拼到上面的insert語句, 當用戶輸入的內容含有單引號時,組拼出來的SQL語句就會存在語法錯誤。要解決這個問題需要對單引號進行轉義,也就是把單引號轉換成兩個單引號。有些時候用戶往往還會輸入像“ & ”這些特殊SQL符號,爲保證組拼好的SQL語句語法正確,必須對SQL語句中的這些特殊SQL符號都進行轉義,顯然,對每條SQL語句都做這樣的處理工作是比較煩瑣的。 SQLiteDatabase類提供了一個重載後的execSQL(String sql, Object[] bindArgs)方法,使用這個方法可以解決前面提到的問題,因爲這個方法支持使用佔位符參數(?)。使用例子如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
db.close();
execSQL(String sql, Object[] bindArgs)方法的第一個參數爲SQL語句,第二個參數爲SQL語句中佔位符參數的值,參數值在數組中的順序要和佔位符的位置對應。
SQLiteDatabase的rawQuery() 用於執行select語句,使用例子如下: SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery(“select * from person”, null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //獲取第一列的值,第一列的索引從0開始
String name = cursor.getString(1);//獲取第二列的值
int age = cursor.getInt(2);//獲取第三列的值
}
cursor.close();
db.close();
rawQuery()方法的第一個參數爲select語句;第二個參數爲select語句中佔位符參數的值,如果select語句沒有使用佔位符,該參數可以設置爲null。帶佔位符參數的select語句使用例子如下:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%傳智%", "4"});

Cursor是結果集遊標,用於對結果集進行隨機訪問,如果大家熟悉jdbc, 其實Cursor與JDBC中的ResultSet作用很相似。使用moveToNext()方法可以將遊標從當前行移動到下一行,如果已經移過了結果集的最後一行,返回結果爲false,否則爲true。另外Cursor 還有常用的moveToPrevious()方法(用於將遊標從當前行移動到上一行,如果已經移過了結果集的第一行,返回值爲false,否則爲true )、moveToFirst()方法(用於將遊標移動到結果集的第一行,如果結果集爲空,返回值爲false,否則爲true )和moveToLast()方法(用於將遊標移動到結果集的最後一行,如果結果集爲空,返回值爲false,否則爲true ) 。
除了前面給大家介紹的execSQL()和rawQuery()方法, 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指的是各種常用的數據類型,如: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的記錄。Insert()方法內部實際上通過構造insert語句完成數據的添加,Insert()方法的第二個參數用於指定空值字段的名稱,相信大家對此參數會感到疑惑,此參數的作用是幹嘛的?是這樣的:如果第三個參數values 爲Null或者元素個數爲0, Insert()方法必然要添加一條除了主鍵之外其它字段爲Null值的記錄,爲了滿足這條insert語句的語法, 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。
delete()方法的使用:
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("person", "personid<?", new String[]{"2"});
db.close();
上面代碼用於從person表中刪除personid小於2的記錄。

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字段的值改爲“傳智播客”。
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關鍵字後面的部分。
使用SQLiteOpenHelper對數據庫進行版本管理
如果應用使用到了SQLite數據庫,在用戶初次使用軟件時,需要創建應用使用到的數據庫表結構及添加一些初始化記錄,另外在軟件升級的時候,也需要對數據表結構進行更新。在Android系統,爲我們提供了一個名爲SQLiteOpenHelper的類,該類用於對數據庫版本進行管理,該類是一個抽象類,必須繼承它才能使用。 爲了實現對數據庫版本進行管理,SQLiteOpenHelper類有兩種重要的方法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)。還可以實現public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)方法,它在每次成功打開數據庫後首先被執行,默認情況下此方法的實現爲空。

當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用於操作數據庫的SQLiteDatabase實例的時候,如果數據庫不存在,Android系統會自動生成一個數據庫,接着調用onCreate()方法,onCreate()方法在初次生成數據庫時纔會被調用,在onCreate()方法裏可以生成數據庫表結構及添加一些應用使用到的初始化數據。onUpgrade()方法在數據庫的版本發生變化時會被調用,數據庫的版本是由程序員控制的,假設數據庫現在的版本是1,由於業務的需要,修改了數據庫表的結構,這時候就需要升級軟件,升級軟件時希望更新用戶手機裏的數據庫表結構,爲了實現這一目的,可以把原來的數據庫版本設置爲2(有同學問設置爲3行不行?當然可以,如果你願意,設置爲100也行),並且在onUpgrade()方法裏面實現表結構的更新。當軟件的版本升級次數比較多,這時在onUpgrade()方法裏面可以根據原版號和目標版本號進行判斷,然後作出相應的表結構及數據更新。

getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用於操作數據庫的SQLiteDatabase實例。但getWritableDatabase() 方法以讀寫方式打開數據庫,一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法先以讀寫方式打開數據庫,如果數據庫的磁盤空間滿了,就會打開失敗,當打開失敗後會繼續嘗試以只讀方式打開數據庫。但若隨後再次調用此方法時,問題已經被解決,只讀的SQLiteDatabase對象會被關閉,而重新返回一個可讀寫的SQLiteDatabase數據庫對象。
public class DatabaseHelper extends SQLiteOpenHelper {
    //類沒有實例化,是不能用作父類構造器的參數,必須聲明爲靜態
         private static final String name = "itcast"; //數據庫名稱
         private static final int version = 1; //數據庫版本
         public DatabaseHelper(Context context) {
//第三個參數CursorFactory指定在執行查詢時獲得一個遊標實例的工廠類,設置爲null,代表使用系統默認的工廠類
                super(context, name, null, version);
         }
        @Override public void onCreate(SQLiteDatabase db) {
              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");  
         }
        @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
               db.execSQL("DROP TABLE IF EXISTS person");
               onCreate(db);
         }
}
上面onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然後再重新創建。一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放於數據庫中的數據不會丟失。
使用SQLiteOpenHelper獲取用於操作數據庫的SQLiteDatabase實例
public class DatabaseHelper extends SQLiteOpenHelper {
         private static final String name = "itcast"; //數據庫名稱
         private static final int version = 1; //數據庫版本
         ......略
}
public class HelloActivity extends Activity {
    @Override public void onCreate(Bundle savedInstanceState) {
        ......
        Button button =(Button) this.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
db.close(); 
}});       
    }
}
第一次調用getWritableDatabase()或getReadableDatabase()方法後,SQLiteOpenHelper會緩存當前的SQLiteDatabase實例,SQLiteDatabase實例正常情況下會維持數據庫的打開狀態,所以在你不再需要SQLiteDatabase實例時,請及時調用close()方法釋放資源。一旦SQLiteDatabase實例被緩存,多次調用getWritableDatabase()或getReadableDatabase()方法得到的都是同一實例。
使用事務操作SQLite數據庫
使用SQLiteDatabase的beginTransaction()方法可以開啓一個事務,程序執行到endTransaction() 方法時會檢查事務的標誌是否爲成功,如果爲成功則提交事務,否則回滾事務。當應用需要提交事務,必須在程序執行到endTransaction()方法之前使用setTransactionSuccessful() 方法設置事務的標誌爲成功,如果不調用setTransactionSuccessful() 方法,默認會回滾事務。使用例子如下: SQLiteDatabase db = ....;
db.beginTransaction();//開始事務
try {
    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
    db.execSQL("update person set name=? where personid=?", new Object[]{"傳智", 1});
    db.setTransactionSuccessful();//調用此方法會在執行到endTransaction() 時提交當前事務,如果不調用此方法會回滾事務
} finally {
    db.endTransaction();//由事務的標誌決定是提交事務,還是回滾事務
}
db.close();
上面兩條SQL語句在同一個事務中執行。
SQLite示例程序

   1.創建Android工程

       Project name: db

       BuildTarget:Android2.2

       Application name: 數據庫應用

       Package name: com.jbridge.db

       Create Activity: DBActivity

       Min SDK Version:8、

2. Person實體

Java代碼 複製代碼 收藏代碼
  1. package com.jbridge.domain; 
  2.  
  3. import android.R.string; 
  4.  
  5. public class Person { 
  6.     private Integer id; 
  7.     private String name; 
  8.     private Short age; 
  9.  
  10.     public Person(String name, Short age) { 
  11.         this.name = name; 
  12.         this.age = age; 
  13.     } 
  14.  
  15.     public Person(Integer id, String name, Short age) { 
  16.         super(); 
  17.         this.id = id; 
  18.         this.name = name; 
  19.         this.age = age; 
  20.     } 
  21.  
  22.     public Integer getId() { 
  23.         return id; 
  24.     } 
  25.  
  26.     public void setId(Integer id) { 
  27.         this.id = id; 
  28.     } 
  29.  
  30.     public String getName() { 
  31.         return name; 
  32.     } 
  33.  
  34.     public void setName(String name) { 
  35.         this.name = name; 
  36.     } 
  37.  
  38.     public Short getAge() { 
  39.         return age; 
  40.     } 
  41.  
  42.     public void setAge(Short age) { 
  43.         this.age = age; 
  44.     } 
  45.  
  46.     @Override 
  47.     public String toString() { 
  48.         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; 
  49.     } 
  50.  
package com.jbridge.domain;import android.R.string;public class Person {	private Integer id;	private String name;	private Short age;	public Person(String name, Short age) {		this.name = name;		this.age = age;	}	public Person(Integer id, String name, Short age) {		super();		this.id = id;		this.name = name;		this.age = age;	}	public Integer getId() {		return id;	}	public void setId(Integer id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public Short getAge() {		return age;	}	public void setAge(Short age) {		this.age = age;	}	@Override	public String toString() {		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";	}}

  3.編寫DataBaseOpenHelper類

      DataBaseOpenHelper繼承自SQLiteOpenHelper類。我們需要創建數據表,必須重寫onCreate(更新時重寫onUpgrade方法)方法,在這個方法中創建數據表。

Java代碼 複製代碼 收藏代碼
  1. package com.jbridge.service; 
  2.  
  3. import android.content.Context; 
  4. import android.database.sqlite.SQLiteDatabase; 
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory; 
  6. import android.database.sqlite.SQLiteOpenHelper; 
  7.  
  8. public class DataBaseOpenHelper extends SQLiteOpenHelper { 
  9.     // 類沒有實例化,是不能用作父類構造器的參數,必須聲明爲靜態 
  10.     private static String dbname = "zyj"; 
  11.     private static int version = 1; 
  12.  
  13.     public DataBaseOpenHelper(Context context) { 
  14.         // 第一個參數是應用的上下文 
  15.         // 第二個參數是應用的數據庫名字 
  16.         // 第三個參數CursorFactory指定在執行查詢時獲得一個遊標實例的工廠類,設置爲null,代表使用系統默認的工廠類 
  17.         // 第四個參數是數據庫版本,必須是大於0的int(即非負數) 
  18.         super(context, dbname, null, version); 
  19.         // TODO Auto-generated constructor stub 
  20.     } 
  21.  
  22.     public DataBaseOpenHelper(Context context, String name, 
  23.             CursorFactory factory, int version) { 
  24.         super(context, name, factory, version); 
  25.         // TODO Auto-generated constructor stub 
  26.     } 
  27.  
  28.     @Override 
  29.     public void onCreate(SQLiteDatabase db) { 
  30.         db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)"); 
  31.     } 
  32.  
  33.     // onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然後再重新創建。 
  34.     // 一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放於數據庫中的數據不會丟失,從版本幾更新到版本幾。 
  35.     @Override 
  36.     public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
  37.         db.execSQL("DROP TABLE IF EXISTS person"); 
  38.         onCreate(db); 
  39.     } 
  40.  
package com.jbridge.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DataBaseOpenHelper extends SQLiteOpenHelper {	// 類沒有實例化,是不能用作父類構造器的參數,必須聲明爲靜態	private static String dbname = "zyj";	private static int version = 1;	public DataBaseOpenHelper(Context context) {		// 第一個參數是應用的上下文		// 第二個參數是應用的數據庫名字		// 第三個參數CursorFactory指定在執行查詢時獲得一個遊標實例的工廠類,設置爲null,代表使用系統默認的工廠類		// 第四個參數是數據庫版本,必須是大於0的int(即非負數)		super(context, dbname, null, version);		// TODO Auto-generated constructor stub	}	public DataBaseOpenHelper(Context context, String name,			CursorFactory factory, int version) {		super(context, name, factory, version);		// TODO Auto-generated constructor stub	}	@Override	public void onCreate(SQLiteDatabase db) {		db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");	}	// onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然後再重新創建。	// 一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放於數據庫中的數據不會丟失,從版本幾更新到版本幾。	@Override	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {		db.execSQL("DROP TABLE IF EXISTS person");		onCreate(db);	}}
4.編寫PersonService類

      PersonService類主要實現對業務邏輯和數據庫的操作。

Java代碼 複製代碼 收藏代碼
  1. package com.jbridge.service; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Currency; 
  5. import java.util.List; 
  6.  
  7. import android.content.Context; 
  8. import android.database.Cursor; 
  9. import android.database.sqlite.SQLiteDatabase; 
  10.  
  11. import com.jbridge.domain.Person; 
  12.  
  13. public class PersonService { 
  14.  
  15.     private DataBaseOpenHelper dbOpenHelper; 
  16.  
  17.     // private Context context; 
  18.  
  19.     public PersonService(Context context) { 
  20.         // this.context = context; 
  21.         dbOpenHelper = new DataBaseOpenHelper(context); 
  22.     } 
  23.  
  24.     public void save(Person person) { 
  25.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); 
  26.         database.beginTransaction(); 
  27.         database.execSQL("insert into person(name,age)values(?,?)", 
  28.                 new Object[] { person.getName(), person.getAge() }); 
  29.         // database.close();可以不關閉數據庫,他裏面會緩存一個數據庫對象,如果以後還要用就直接用這個緩存的數據庫對象。但通過 
  30.         // context.openOrCreateDatabase(arg0, arg1, arg2)打開的數據庫必須得關閉 
  31.         database.setTransactionSuccessful(); 
  32.         database.endTransaction(); 
  33.  
  34.     } 
  35.  
  36.     public void update(Person person) { 
  37.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); 
  38.         database.execSQL( 
  39.                 "update person set name=?,age=? where personid=?", 
  40.                 new Object[] { person.getName(), person.getAge(), 
  41.                         person.getId() }); 
  42.     } 
  43.  
  44.     public Person find(Integer id) { 
  45.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  46.         Cursor cursor = database.rawQuery( 
  47.                 "select * from person where personid=?", 
  48.                 new String[] { String.valueOf(id) }); 
  49.         if (cursor.moveToNext()) { 
  50.             return new Person(cursor.getInt(0), cursor.getString(1), 
  51.                     cursor.getShort(2)); 
  52.         } 
  53.         return null; 
  54.     } 
  55.  
  56.     public void delete(Integer... ids) { 
  57.         if (ids.length > 0) { 
  58.             StringBuffer sb = new StringBuffer(); 
  59.             for (Integer id : ids) { 
  60.                 sb.append('?').append(','); 
  61.             } 
  62.             sb.deleteCharAt(sb.length() - 1); 
  63.             SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); 
  64.             database.execSQL( 
  65.                     "delete from person where personid in(" + sb.toString() 
  66.                             + ")", ids); 
  67.         } 
  68.     } 
  69.  
  70.     public List<Person> getScrollData(int startResult, int maxResult) { 
  71.         List<Person> persons = new ArrayList<Person>(); 
  72.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  73.         Cursor cursor = database.rawQuery( 
  74.                 "select * from person limit ?,?", 
  75.                 new String[] { String.valueOf(startResult), 
  76.                         String.valueOf(maxResult) }); 
  77.         while (cursor.moveToNext()) { 
  78.             persons.add(new Person(cursor.getInt(0), cursor.getString(1), 
  79.                     cursor.getShort(2))); 
  80.         } 
  81.         return persons; 
  82.     } 
  83.  
  84.     // 獲取分頁數據,提供給SimpleCursorAdapter使用。 
  85.     public Cursor getRawScrollData(int startResult, int maxResult) { 
  86.         List<Person> persons = new ArrayList<Person>(); 
  87.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  88.         return database.rawQuery( 
  89.                 "select personid as _id ,name,age from person limit ?,?", 
  90.                 new String[] { String.valueOf(startResult), 
  91.                         String.valueOf(maxResult) }); 
  92.  
  93.     } 
  94.  
  95.     public long getCount() { 
  96.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  97.         Cursor cursor = database.rawQuery("select count(*) from person", null); 
  98.         if (cursor.moveToNext()) { 
  99.             return cursor.getLong(0); 
  100.         } 
  101.         return 0; 
  102.     } 
  103.  
package com.jbridge.service;import java.util.ArrayList;import java.util.Currency;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.jbridge.domain.Person;public class PersonService {	private DataBaseOpenHelper dbOpenHelper;	// private Context context;	public PersonService(Context context) {		// this.context = context;		dbOpenHelper = new DataBaseOpenHelper(context);	}	public void save(Person person) {		SQLiteDatabase database = dbOpenHelper.getWritableDatabase();		database.beginTransaction();		database.execSQL("insert into person(name,age)values(?,?)",				new Object[] { person.getName(), person.getAge() });		// database.close();可以不關閉數據庫,他裏面會緩存一個數據庫對象,如果以後還要用就直接用這個緩存的數據庫對象。但通過		// context.openOrCreateDatabase(arg0, arg1, arg2)打開的數據庫必須得關閉		database.setTransactionSuccessful();		database.endTransaction();	}	public void update(Person person) {		SQLiteDatabase database = dbOpenHelper.getWritableDatabase();		database.execSQL(				"update person set name=?,age=? where personid=?",				new Object[] { person.getName(), person.getAge(),						person.getId() });	}	public Person find(Integer id) {		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		Cursor cursor = database.rawQuery(				"select * from person where personid=?",				new String[] { String.valueOf(id) });		if (cursor.moveToNext()) {			return new Person(cursor.getInt(0), cursor.getString(1),					cursor.getShort(2));		}		return null;	}	public void delete(Integer... ids) {		if (ids.length > 0) {			StringBuffer sb = new StringBuffer();			for (Integer id : ids) {				sb.append('?').append(',');			}			sb.deleteCharAt(sb.length() - 1);			SQLiteDatabase database = dbOpenHelper.getWritableDatabase();			database.execSQL(					"delete from person where personid in(" + sb.toString()							+ ")", ids);		}	}	public List<Person> getScrollData(int startResult, int maxResult) {		List<Person> persons = new ArrayList<Person>();		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		Cursor cursor = database.rawQuery(				"select * from person limit ?,?",				new String[] { String.valueOf(startResult),						String.valueOf(maxResult) });		while (cursor.moveToNext()) {			persons.add(new Person(cursor.getInt(0), cursor.getString(1),					cursor.getShort(2)));		}		return persons;	}	// 獲取分頁數據,提供給SimpleCursorAdapter使用。	public Cursor getRawScrollData(int startResult, int maxResult) {		List<Person> persons = new ArrayList<Person>();		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		return database.rawQuery(				"select personid as _id ,name,age from person limit ?,?",				new String[] { String.valueOf(startResult),						String.valueOf(maxResult) });	}	public long getCount() {		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		Cursor cursor = database.rawQuery("select count(*) from person", null);		if (cursor.moveToNext()) {			return cursor.getLong(0);		}		return 0;	}}

下面是使用 insert()、delete()、update()和query()方法實現的業務類

Java代碼 複製代碼 收藏代碼
  1. package com.jbridge.service; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Currency; 
  5. import java.util.List; 
  6.  
  7. import android.R.string; 
  8. import android.content.ContentValues; 
  9. import android.content.Context; 
  10. import android.database.Cursor; 
  11. import android.database.sqlite.SQLiteDatabase; 
  12.  
  13. import com.jbridge.domain.Person; 
  14.  
  15. public class OtherPersonService { 
  16.  
  17.     private DataBaseOpenHelper dbOpenHelper; 
  18.  
  19.     // private Context context; 
  20.  
  21.     public OtherPersonService(Context context) { 
  22.         // this.context = context; 
  23.         dbOpenHelper = new DataBaseOpenHelper(context); 
  24.     } 
  25.  
  26.     public void save(Person person) { 
  27.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); 
  28.         ContentValues contentValues = new ContentValues(); 
  29.         contentValues.put("name", person.getName()); 
  30.         contentValues.put("age", person.getAge()); 
  31.         database.insert("person", null, contentValues); 
  32.     } 
  33.  
  34.     public void update(Person person) { 
  35.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); 
  36.         ContentValues contentValues = new ContentValues(); 
  37.         contentValues.put("name", person.getName()); 
  38.         contentValues.put("age", person.getAge()); 
  39.         database.update("person", null, "personid=?", 
  40.                 new String[] { String.valueOf(person.getId()) }); 
  41.     } 
  42.  
  43.     public Person find(Integer id) { 
  44.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  45.         Cursor cursor = database.query("person", new String[] { "personid", 
  46.                 "name", "age" }, "personid=?", 
  47.                 new String[] { String.valueOf(id) }, null, null, null); 
  48.         if (cursor.moveToNext()) { 
  49.             return new Person(cursor.getInt(0), cursor.getString(1), 
  50.                     cursor.getShort(2)); 
  51.         } 
  52.         return null; 
  53.     } 
  54.  
  55.     public void delete(Integer... ids) { 
  56.         if (ids.length > 0) { 
  57.             StringBuffer sb = new StringBuffer(); 
  58.             String[] strIds = new String[ids.length]; 
  59.             // for (Integer id : ids) { 
  60.             // sb.append('?').append(','); 
  61.             // } 
  62.             for (int i = 0; i < strIds.length; i++) { 
  63.                 sb.append('?').append(','); 
  64.                 strIds[i] = String.valueOf(ids[i]); 
  65.             } 
  66.             sb.deleteCharAt(sb.length() - 1); 
  67.             SQLiteDatabase database = dbOpenHelper.getWritableDatabase(); 
  68.             database.delete("person", "personid in(" + sb.toString() + ")", 
  69.                     strIds); 
  70.         } 
  71.     } 
  72.  
  73.     public List<Person> getScrollData(int startResult, int maxResult) { 
  74.         List<Person> persons = new ArrayList<Person>(); 
  75.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  76.         Cursor cursor = database.query("person", new String[] { "personid", 
  77.                 "name", "age" }, null, null, null, null, "personid desc", 
  78.                 startResult + "," + maxResult); 
  79.         while (cursor.moveToNext()) { 
  80.             persons.add(new Person(cursor.getInt(0), cursor.getString(1), 
  81.                     cursor.getShort(2))); 
  82.         } 
  83.         return persons; 
  84.     } 
  85.  
  86.     public long getCount() { 
  87.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase(); 
  88.         Cursor cursor = database.query("person", new String[] { "count(*)" }, 
  89.                 null, null, null, null, null); 
  90.         if (cursor.moveToNext()) { 
  91.             return cursor.getLong(0); 
  92.         } 
  93.         return 0; 
  94.     } 
  95.  
package com.jbridge.service;import java.util.ArrayList;import java.util.Currency;import java.util.List;import android.R.string;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.jbridge.domain.Person;public class OtherPersonService {	private DataBaseOpenHelper dbOpenHelper;	// private Context context;	public OtherPersonService(Context context) {		// this.context = context;		dbOpenHelper = new DataBaseOpenHelper(context);	}	public void save(Person person) {		SQLiteDatabase database = dbOpenHelper.getWritableDatabase();		ContentValues contentValues = new ContentValues();		contentValues.put("name", person.getName());		contentValues.put("age", person.getAge());		database.insert("person", null, contentValues);	}	public void update(Person person) {		SQLiteDatabase database = dbOpenHelper.getWritableDatabase();		ContentValues contentValues = new ContentValues();		contentValues.put("name", person.getName());		contentValues.put("age", person.getAge());		database.update("person", null, "personid=?",				new String[] { String.valueOf(person.getId()) });	}	public Person find(Integer id) {		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		Cursor cursor = database.query("person", new String[] { "personid",				"name", "age" }, "personid=?",				new String[] { String.valueOf(id) }, null, null, null);		if (cursor.moveToNext()) {			return new Person(cursor.getInt(0), cursor.getString(1),					cursor.getShort(2));		}		return null;	}	public void delete(Integer... ids) {		if (ids.length > 0) {			StringBuffer sb = new StringBuffer();			String[] strIds = new String[ids.length];			// for (Integer id : ids) {			// sb.append('?').append(',');			// }			for (int i = 0; i < strIds.length; i++) {				sb.append('?').append(',');				strIds[i] = String.valueOf(ids[i]);			}			sb.deleteCharAt(sb.length() - 1);			SQLiteDatabase database = dbOpenHelper.getWritableDatabase();			database.delete("person", "personid in(" + sb.toString() + ")",					strIds);		}	}	public List<Person> getScrollData(int startResult, int maxResult) {		List<Person> persons = new ArrayList<Person>();		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		Cursor cursor = database.query("person", new String[] { "personid",				"name", "age" }, null, null, null, null, "personid desc",				startResult + "," + maxResult);		while (cursor.moveToNext()) {			persons.add(new Person(cursor.getInt(0), cursor.getString(1),					cursor.getShort(2)));		}		return persons;	}	public long getCount() {		SQLiteDatabase database = dbOpenHelper.getReadableDatabase();		Cursor cursor = database.query("person", new String[] { "count(*)" },				null, null, null, null, null);		if (cursor.moveToNext()) {			return cursor.getLong(0);		}		return 0;	}}
  5.編寫測試類

       編寫一個針對PersonService的測試類,測試PersonService類中的各個方法是否正確。

Java代碼 複製代碼 收藏代碼
  1. package com.jbridge.db; 
  2.  
  3. import java.util.List; 
  4.  
  5. import com.jbridge.domain.Person; 
  6. import com.jbridge.service.OtherPersonService; 
  7. import com.jbridge.service.PersonService; 
  8.  
  9. import android.test.AndroidTestCase; 
  10. import android.util.Log; 
  11.  
  12. public class PersonServiceTest extends AndroidTestCase { 
  13.     private static String TAG = "PersonServiceTest"; 
  14.  
  15.     // OtherPersonService personService = new 
  16.     // OtherPersonService(this.getContext()); 
  17.     // //不可以這麼寫,因爲Android把context環境變量是在PersonServiceTest實例化後給他的 
  18.  
  19.     public void testSave() throws Exception { 
  20.         PersonService personService = new PersonService(this.getContext()); 
  21.         // personService.save(new Person("老豬", (short) 11)); 
  22.         for (int i = 0; i < 10; i++) { 
  23.             personService.save(new Person("你" + i, (short) (i + 10))); 
  24.         } 
  25.  
  26.     } 
  27.  
  28.     public void testFind() throws Exception { 
  29.         PersonService personService = new PersonService(this.getContext()); 
  30.         Person person = personService.find(1); 
  31.         Log.i(TAG, person.toString()); 
  32.     } 
  33.  
  34.     public void testUpdate() throws Exception { 
  35.         PersonService personService = new PersonService(this.getContext()); 
  36.         Person person = personService.find(1); 
  37.         person.setName("lv"); 
  38.         personService.update(person); 
  39.     } 
  40.  
  41.     public void testDelete() throws Exception { 
  42.         PersonService personService = new PersonService(this.getContext()); 
  43.         personService.delete(1, 2, 3); 
  44.     } 
  45.  
  46.     public void testGetCount() throws Exception { 
  47.         PersonService personService = new PersonService(this.getContext()); 
  48.         Log.i(TAG, String.valueOf(personService.getCount())); 
  49.     } 
  50.  
  51.     public void testGetScrollData() throws Exception { 
  52.         PersonService personService = new PersonService(this.getContext()); 
  53.         List<Person> persons = personService.getScrollData(0, 3); 
  54.         for (Person person : persons) { 
  55.             Log.i(TAG, person.toString()); 
  56.         } 
  57.     } 
package com.jbridge.db;import java.util.List;import com.jbridge.domain.Person;import com.jbridge.service.OtherPersonService;import com.jbridge.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class PersonServiceTest extends AndroidTestCase {	private static String TAG = "PersonServiceTest";	// OtherPersonService personService = new	// OtherPersonService(this.getContext());	// //不可以這麼寫,因爲Android把context環境變量是在PersonServiceTest實例化後給他的	public void testSave() throws Exception {		PersonService personService = new PersonService(this.getContext());		// personService.save(new Person("老豬", (short) 11));		for (int i = 0; i < 10; i++) {			personService.save(new Person("你" + i, (short) (i + 10)));		}	}	public void testFind() throws Exception {		PersonService personService = new PersonService(this.getContext());		Person person = personService.find(1);		Log.i(TAG, person.toString());	}	public void testUpdate() throws Exception {		PersonService personService = new PersonService(this.getContext());		Person person = personService.find(1);		person.setName("lv");		personService.update(person);	}	public void testDelete() throws Exception {		PersonService personService = new PersonService(this.getContext());		personService.delete(1, 2, 3);	}	public void testGetCount() throws Exception {		PersonService personService = new PersonService(this.getContext());		Log.i(TAG, String.valueOf(personService.getCount()));	}	public void testGetScrollData() throws Exception {		PersonService personService = new PersonService(this.getContext());		List<Person> persons = personService.getScrollData(0, 3);		for (Person person : persons) {			Log.i(TAG, person.toString());		}	}}
     啓用測試功能,不要忘記在AndroidManifest.xml文件中加入測試環境。爲application元素添加一個子元素:<uses-library android:name="android.test.runner"/>,爲application元素添加一個兄弟元素:<instrumentation android:name="android.test.InstrumentationTestRunner"     android:targetPackage="com.jbridge.db" android:label="Tests for My App" />。

       SQLite數據庫以單個文件存儲,就像微軟的Access數據庫。有一個查看SQLite數據庫文件的工具——SQLite Developer,我們可以使用它來查看數據庫。Android將創建的數據庫存放在”/data/data/ com.jbridge.db/databases/person”,我們將它導出然後使用SQLite Developer打開。

  6.分頁顯示數據

       我們在ContactsService類中,提供了一個獲取分頁數據的方法。我們將調用它獲取的數據,使用ListView組件顯示出來。

       編輯mail.xml:

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7.     <RelativeLayout 
  8.   xmlns:android="http://schemas.android.com/apk/res/android" 
  9.   android:layout_width="fill_parent" 
  10.   android:layout_height="wrap_content"> 
  11.   <TextView 
  12.   android:layout_width="40px" 
  13.   android:layout_height="wrap_content" 
  14.   android:textSize="20px" 
  15.   android:id="@+id/personidtitle" 
  16.   android:text="編號" 
  17.   /> 
  18.    <TextView 
  19.   android:layout_width="200px" 
  20.   android:layout_height="wrap_content" 
  21.    android:textSize="20px" 
  22.   android:layout_toRightOf="@id/personidtitle" 
  23.    android:layout_alignTop="@id/personidtitle" 
  24.    android:gravity="center_horizontal" 
  25.    android:id="@+id/nametitle" 
  26.    android:text="姓名" 
  27.   /> 
  28.    <TextView 
  29.   android:layout_width="wrap_content" 
  30.   android:layout_height="wrap_content" 
  31.    android:textSize="20px" 
  32.   android:layout_toRightOf="@id/nametitle" 
  33.    android:layout_alignTop="@id/nametitle" 
  34.    android:id="@+id/agetitle" 
  35.    android:text="年齡" 
  36.   /> 
  37. </RelativeLayout> 
  38. <ListView   
  39.     android:layout_width="fill_parent"  
  40.     android:layout_height="wrap_content"  
  41.     android:id="@+id/listView" 
  42.     /> 
  43. </LinearLayout> 
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    >    <RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="wrap_content">  <TextView  android:layout_width="40px"  android:layout_height="wrap_content"  android:textSize="20px"  android:id="@+id/personidtitle"  android:text="編號"  />   <TextView  android:layout_width="200px"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/personidtitle"   android:layout_alignTop="@id/personidtitle"   android:gravity="center_horizontal"   android:id="@+id/nametitle"   android:text="姓名"  />   <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/nametitle"   android:layout_alignTop="@id/nametitle"   android:id="@+id/agetitle"   android:text="年齡"  /></RelativeLayout><ListView      android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:id="@+id/listView"    /></LinearLayout>

在mail.xml所在目錄裏添加一個personitem.xml:

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <RelativeLayout 
  3.   xmlns:android="http://schemas.android.com/apk/res/android" 
  4.   android:layout_width="fill_parent" 
  5.   android:layout_height="wrap_content"> 
  6.   <TextView 
  7.   android:layout_width="40px" 
  8.   android:layout_height="wrap_content" 
  9.   android:textSize="20px" 
  10.   android:id="@+id/personid" 
  11.   /> 
  12.    <TextView 
  13.   android:layout_width="200px" 
  14.   android:layout_height="wrap_content" 
  15.    android:textSize="20px" 
  16.   android:layout_toRightOf="@id/personid" 
  17.    android:layout_alignTop="@id/personid" 
  18.    android:gravity="center_horizontal" 
  19.    android:id="@+id/name" 
  20.   /> 
  21.    <TextView 
  22.   android:layout_width="wrap_content" 
  23.   android:layout_height="wrap_content" 
  24.    android:textSize="20px" 
  25.   android:layout_toRightOf="@id/name" 
  26.    android:layout_alignTop="@id/name" 
  27.    android:id="@+id/age" 
  28.   /> 
  29. </RelativeLayout> 
<?xml version="1.0" encoding="utf-8"?><RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="wrap_content">  <TextView  android:layout_width="40px"  android:layout_height="wrap_content"  android:textSize="20px"  android:id="@+id/personid"  />   <TextView  android:layout_width="200px"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/personid"   android:layout_alignTop="@id/personid"   android:gravity="center_horizontal"   android:id="@+id/name"  />   <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/name"   android:layout_alignTop="@id/name"   android:id="@+id/age"  /></RelativeLayout>

編輯 DBActivity 類:

Java代碼 複製代碼 收藏代碼
  1. package com.jbridge.db; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.HashMap; 
  5. import java.util.List; 
  6.  
  7. import com.jbridge.domain.Person; 
  8. import com.jbridge.service.PersonService; 
  9.  
  10. import android.R.string; 
  11. import android.app.Activity; 
  12. import android.database.Cursor; 
  13. import android.os.Bundle; 
  14. import android.provider.LiveFolders; 
  15. import android.util.Log; 
  16. import android.view.View; 
  17. import android.widget.AdapterView; 
  18. import android.widget.ArrayAdapter; 
  19. import android.widget.ListView; 
  20. import android.widget.SimpleAdapter; 
  21. import android.widget.SimpleCursorAdapter; 
  22. import android.widget.Toast; 
  23.  
  24. public class DBActivity extends Activity { 
  25.     /** Called when the activity is first created. */ 
  26.     private static final String TAG = "DBActivity"; 
  27. /*實現方法一
  28.      @Override
  29.      public void onCreate(Bundle savedInstanceState) {
  30.      super.onCreate(savedInstanceState);
  31.      setContentView(R.layout.main);
  32.      PersonService personService=new PersonService(this);
  33.      ListView listView = (ListView) this.findViewById(R.id.listView);
  34.     
  35.      List<HashMap<String, String>> data = new ArrayList<HashMap<String,
  36.      String>>();
  37.      // HashMap<String, String> title = new HashMap<String, String>();
  38.      // title.put("personid", "編號");
  39.      // title.put("name", "姓名");
  40.      // title.put("age", "年齡");
  41.      // data.add(title);
  42.     
  43.      List<Person> persons= personService.getScrollData(0, 10);
  44.      for (Person person : persons) {
  45.      HashMap<String, String> p = new HashMap<String, String>();
  46.      p.put("personid", String.valueOf(person.getId()));
  47.      p.put("name", person.getName());
  48.      p.put("age",String.valueOf(person.getAge()));
  49.      data.add(p);
  50.      }
  51.     
  52.      // 適配器有:
  53.      // ArrayAdapter<T>
  54.      // simpAdapter
  55.      // SimpleCursorAdapter
  56.      SimpleAdapter adapter = new SimpleAdapter(DBActivity.this, data,
  57.      R.layout.personitem,
  58.      new String[] { "personid", "name", "age" },
  59.      new int[] {R.id.personid, R.id.name, R.id.age });
  60.      listView.setAdapter(adapter);
  61.     
  62.      listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
  63.      @Override
  64.      // parent即爲你點擊的listView
  65.      // view爲listview的外面佈局
  66.      public void onItemClick(AdapterView<?> parent, View view, int position,
  67.      long id) {
  68.      ListView listView= (ListView) parent;
  69.      HashMap<String, String> itemdata= (HashMap<String, String>)
  70.      listView.getItemAtPosition(position);
  71.      String personid=itemdata.get("personid");
  72.      String name=itemdata.get("name");
  73.      String age=itemdata.get("age");
  74.      Log.i(TAG,view.getClass().getName());
  75.      Log.i(TAG, "personid: "+personid+ "   name: "+name+"   age:   "+age);
  76.      Log.i(TAG," position==id:"+ (position==id));
  77.     Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show();
  78.      }
  79.     
  80.      });
  81.     
  82.      }
  83.     
  84. */ 
  85.      
  86. //  實現方法二(遊標) 
  87.     @Override 
  88.     public void onCreate(Bundle savedInstanceState) { 
  89.         super.onCreate(savedInstanceState); 
  90.         setContentView(R.layout.main); 
  91.         PersonService personService = new PersonService(this); 
  92.         ListView listView = (ListView) this.findViewById(R.id.listView); 
  93.  
  94.         List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>(); 
  95.         // HashMap<String, String> title = new HashMap<String, String>(); 
  96.         // title.put("personid", "編號"); 
  97.         // title.put("name", "姓名"); 
  98.         // title.put("age", "年齡"); 
  99.         // data.add(title); 
  100.  
  101.         // 適配器有: 
  102.         // ArrayAdapter<T> 
  103.         // simpAdapter 
  104.         // SimpleCursorAdapter 
  105.         Cursor cursor = personService.getRawScrollData(0, 10); 
  106.         SimpleCursorAdapter adapter = new SimpleCursorAdapter(DBActivity.this, 
  107.                 R.layout.personitem, cursor, new String[] { "_id", "name", 
  108.                         "age" }, 
  109.                 new int[] { R.id.personid, R.id.name, R.id.age }); 
  110.         listView.setAdapter(adapter); 
  111.  
  112.         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
  113.  
  114.             @Override 
  115.             // parent即爲你點擊的listView 
  116.             // view爲listview的外面佈局 
  117.             public void onItemClick(AdapterView<?> parent, View view, 
  118.                     int position, long id) { 
  119.                 ListView listView = (ListView) parent; 
  120.                 Cursor cursor = (Cursor) listView.getItemAtPosition(position); 
  121.                 String personid = String.valueOf(cursor.getInt(0)); 
  122.                 String name = String.valueOf(cursor.getString(1)); 
  123.                 String age = String.valueOf(cursor.getShort(2)); 
  124.                 Log.i(TAG, view.getClass().getName()); 
  125.                 Log.i(TAG, "personid: " + personid + "   name: " + name 
  126.                         + "   age:   " + age); 
  127.                 Log.i(TAG, " position==id:" + (position == id)); 
  128.                 Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show(); 
  129.             } 
  130.  
  131.         }); 
  132.  
  133.     } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章