編輯:關於Android編程
Google為Andriod的較大的數據處理提供了SQLite,他在數據存儲、管理、維護等各方面都相當出色,功能也非常的強大。
袖珍型的SQLite可以支持高達2TB大小的數據庫,每個數據庫都是以單個文件的形式存在,這些數據都是以B-Tree的數據結構形式存儲在磁盤上。
在事務處理方面,SQLite通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程想數據庫執行寫操作之前,必須獲得獨占鎖。在獲得獨占鎖之後,其他的讀或寫操作將不會再發生。
SQLite采用動態數據類型,當某個值插入到數據庫時,SQLite將會檢查它的類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作為本身的類型存儲,SQLite稱這為“弱類型”。但有一個特例,如果是INTEGER PRIMARY KEY,則其他類型不會被轉換,會報一個“datatype missmatch”的錯誤。
概括來講,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數據類型,分別代表空值、整型值、浮點值、字符串文本、二進制對象。
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))
PersonSqliteOpenHelper類
public class PersonSqliteOpenHelper extends SQLiteOpenHelper {
/**
* 數據庫的構造方法
* 數據庫查詢的結果集,為null則使用默認的結果集
* 數據庫的版本,從1開始,小於1則拋異常
* @param context
*/
public PersonSqliteOpenHelper(Context context) {
super(context, "person.db", null, 1);
}
/**
* 數據庫在第一次被創建時調用,表結構,初始化
* 數據類型的長度是無用的,只是給程序員看的
* @param sqLiteDatabase 數據庫
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table person (id integer primary key autoincrement, name varchar(20), number varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
PersonDao類
public class PersonDao { private PersonSqliteOpenHelper helper; public PersonDao(Context context) { helper = new PersonSqliteOpenHelper(context); } public void add(String name, String number){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("insert into person (name,number) values (?,?)", new Object[]{name,number}); db.close(); } public boolean find(String name){ SQLiteDatabase db = helper.getWritableDatabase(); Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name}); boolean result = cursor.moveToNext(); cursor.close(); db.close(); return result; } public void update(String name, String newnumber){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update person set number=? where name=?", new Object[]{newnumber, name}); db.close(); } public void delete(String name){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("delete from person where name=?",new String[]{name}); db.close(); } public List findAll(){ SQLiteDatabase db = helper.getReadableDatabase(); List persons = new ArrayList(); Cursor cursor = db.rawQuery("select name,id,number from person ",null); while (cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String number = cursor.getString(cursor.getColumnIndex("number")); Person p = new Person(id,name,number); persons.add(p); } cursor.close(); db.close(); return persons; } }
public class Person {
private int id;
private String name;
private String number;
public Person() {
}
public Person(int id, String name, String number) {
this.id = id;
this.name = name;
this.number = number;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", number='" + number + '\'' +
'}';
}
}
ApplicationTest類
public class ApplicationTest extends ApplicationTestCase {
public ApplicationTest() {
super(Application.class);
}
public void testDBHelp() throws Exception{
PersonSqliteOpenHelper perSQL = new PersonSqliteOpenHelper(getContext());
perSQL.getWritableDatabase();
}
public void testAdd() throws Exception{
PersonDao dao = new PersonDao(getContext());
dao.add("小明", "18500003039");
}
public void testFind(){
PersonDao dao = new PersonDao(getContext());
boolean result = dao.find("小明");
assertEquals(true, result);
}
public void testUpdate(){
PersonDao dao = new PersonDao(getContext());
dao.add("大帥", "13100001423");
}
public void testDelete(){
PersonDao dao = new PersonDao(getContext());
dao.delete("小明");
}
public void testFindAll(){
PersonDao dao = new PersonDao(getContext());
List persons = dao.findAll();
for (Person p:persons){
System.out.println(p.toString());
}
}
}
使用Android自帶API
public class PersonDao2 {
private PersonSqliteOpenHelper helper;
public PersonDao2(Context context) {
helper = new PersonSqliteOpenHelper(context);
}
public long add(String name, String number){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("insert into person (name,number) values (?,?)", new Object[]{name,number});
ContentValues values = new ContentValues();
values.put("name",name);
values.put("number", number);
long result = db.insert("person",null,values);
db.close();
return result;
}
public boolean find(String name){
SQLiteDatabase db = helper.getWritableDatabase();
//Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
Cursor cursor = db.query("person",null,"name=?",new String[]{name},null,null,null);
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
}
public int update(String name, String newnumber){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("update person set number=? where name=?", new Object[]{newnumber, name});
ContentValues values = new ContentValues();
values.put("number", newnumber);
int result = db.update("person",values,"name=?",new String[]{name});
db.close();
return result;
}
public int delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("delete from person where name=?", new String[]{name});
int result = db.delete("person","name=?",new String[]{name});
db.close();
return result;
}
public List findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
List persons = new ArrayList();
//Cursor cursor = db.rawQuery("select name,id,number from person ",null);
Cursor cursor = db.query("person",new String[]{"name","id","number"},null,null,null,null,null);
while (cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
Person p = new Person(id,name,number);
persons.add(p);
}
cursor.close();
db.close();
return persons;
}
}
SQLite修改數據庫結構,先修改數據庫版本號,然後再重寫onUpgrade方法,執行需要的操作,注意,此方法只在版本號增加後首次運行時執行。
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i(TAG,"databases is modified");
sqLiteDatabase.execSQL("alter table person add account varchar(20)");
}
SQLite的事務處理
public void testTransaction(){
SQLiteDatabase db = helper.getReadableDatabase();
db.beginTransaction();
try {
db.execSQL("update person set account=account-1000 where name=?", new Object[]{"楊小明"});
db.execSQL("update person set account=account+1000 where name=?", new Object[]{"范大帥"});
db.setTransactionSuccessful();
}catch (Exception e){
}finally {
db.endTransaction();
db.close();
}
}
先插入兩條數據,初始化金額,再執行事務處理的方法,得到如下結果:
8:14:36.456 13235-13248/? I/TAGG﹕ Person{id=19, name='楊小明', number='18500003039', account=5000}
08-16 18:14:36.456 13235-13248/? I/TAGG﹕ Person{id=20, name='范大帥', number='13300001423', account=2000}
08-16 18:15:23.371 13435-13448/com.haier.sqlitedatabase I/TAGG﹕ Person{id=19, name='楊小明', number='18500003039', account=4000}
08-16 18:15:23.371 13435-13448/com.haier.sqlitedatabase I/TAGG﹕ Person{id=20, name='范大帥', number='13300001423', account=3000}
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android編程單元測試實例詳解(附源碼)
本文實例講述了Android編程單元測試。分享給大家供大家參考,具體如下:完整實例代碼代碼點擊此處本站下載。本文是在上一篇文章《java編程之單元測試(Junit)實例分
Android Studio 入門
一. 下載安裝 JDK安裝並配置JAVA_HOME環境變量 這個就略過了,純小白請自行百度 Android Studio安裝 截止到2016年4月9日Andro
Hybrid移動應用:用網頁技術提供Native體驗
移動app可以大致被分為三種,native、hybrid和web app。如果使用native app,你可以使用設備和操作系統的所有能力,同時,平台的性能負荷最小。然而
Android Notes 之 Activity生命周期的探索
Activity:作為四大組件之一,也是與用戶交互最多的組件,因此為了更好的交互效果,了解Activity的生命周期,正確分配每個階段該完成的工作就顯得十分必要,例如: