編輯:關於Android編程
轉載請注明出處:明桑Android
在Android平台下有各種不同方法可以實現應用程序數據的存儲和管理(SharedPerferences,File,SQLiteDatabase,網絡存儲),方法的選擇依賴於需要存儲的數據類型和數據結構。SQLite數據庫能夠安全而有效地解決結構化數據的存儲問題;
這裡主要介紹SQLite相關的用法,以及對數據庫常見操作的封裝。
最後,作為一個綜合案例,做一個簡單的學生管理的demo,創建student.db,包括name,grade字段,實現增、刪、改、查的功能;Android 數據存儲 利用SQLiteDatabase實現簡單的學生管理
1,什麼是SQLite
SQLite是開源的,支持標准SQL語法的關系型數據庫,支持事務,運行時需要很小的內存(250k);
支持的數據類型包括:Text,INTEGER,REAL(like double in Java),其他的所有數據類型必須轉換成以上數據類型才能被存儲在數據庫中,
SQLite是嵌入在每一個Android設備中的,所以使用SQLite並不需要去安裝和管理數據庫
你所需要做的僅僅是定義SQL語句用來創建和管理數據表
訪問一個SQLite數據庫可能要訪問文件系統,所以建議異步執行數據庫操作;
創建一個數據庫後,默認是存在DATA/APP_NAME/databases/FILENAME
下的。
2, SQLite 結構:
在SDK中,android.database包中含數據庫所需要的操作類,android.database.sqlite包含所有關於SQLite數據庫的操作
3,SQLiteOpenHelper類的使用:
創建一個持久化的數據庫,可以通過繼承SQLiteOpenHelper
,然後在構造方法中調用
super(context, DATABASE_NAME, null, VERSION);//傳入定義好的數據庫名和版本;
你還需要覆寫兩個方法:
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//創建
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
//更新
sqLiteDatabase.execSQL(DROP TABLE IF EXISTS + TABLE_NAME);
onCreate(sqLiteDatabase);
}
以上兩個方法均接受一個SQLiteDatabase db對象,SQLiteOpenHelper還提供了兩個方法getWritableDatabase(),getReadableDatabase()用來得到SQLiteDatabase對象,
4,SQLiteDatabase
SQLiteDatabase是一個基本數據庫類,用於在Android中提供增刪改查等基礎操作。insert(),update(),delete();另外它還提供了execSQL()方法來直接執行SQL語句;
當我們需要插入或更新數據表時,需要使用ContentValues,ContentValues對象允許定義鍵值對,key指向數據表中的字段,value指向表記錄的內容。
查詢可以通過rawQuery()或者query()方法或者 SQLiteQueryBuilder()方法
rawQuery()直接接受一個SQL select語句作為輸入
Cursor cursor= getReadableDatabase().rawQuery(Select * from TABLE where id=?,new String[]{id});
query()提供了一個結構化的指定接口用於SQL查詢
Cursor cursor=getReadableDatabase().query(DATABASE_TABE,new String[]{KEY_ROAB,KEY_ID,KEY_NAME,KEY_HH},null,null,null,null);
SQLiteQueryBuilder()用於構建復雜的SQL查詢,比如當有多個數據表且它們之間關系比較復雜時使用。
5, Cursor:
一條查詢返回一個Cursor對象, Cursor主要指向查詢結果的一行,這樣Android可以緩沖查詢結果,而不用將所有數據全部加載到內存;
為了得到查詢結果的數目,可以使用getCount();
為了在查詢的結果上移動,你可以使用moveToFirst(), moveToNext();
isAfterLast()則返回是否已經到達查詢結果的末尾。
Cursor提供get*(),方法比如getLong(columnIndex),getString(columnIndex)獲取查詢結果列的數據,columnIndex代表列數,Cursor還提供了getColumnIndexorThrow(String name)獲取一個表中字段名為name的列的number。
了解了相關的概念,我們對Android常見的數據庫操作按以下步驟做個總結:
為每一個表創建一個Model類,即對應數據類:實現DatabaseHandler類
繼承自SQLiteOpenHelper類,實現構造函數(創建表)和覆寫onCreate()、onUpgrade()方法 根據我們的需要封裝CRUD方法(增刪改查) 實現具體的CRUD方法使用DatabaseHandler類,將數據綁定到界面,通過自定義adapter顯示在adapterView(ListView..GridView等)上。
以聯系人為例,我們需要創建一個關於Contact的數據庫;
public class Contact{
private int id;
private String name;
private String number;
//設置getset方法
...
get()
set()
//提供構造函數
Contact(int id,String name, String number){}
}
private static final String DATABASE_NAME=Contact;
private static final String TABLE_NAME=contact;
private static final int VERSION=1;
private static final String KEY_ID=id;
private static final String KEY_NAME=name;
private static final String KEY_NUMBER=number;
private static final String CREATE_TABLE=create table +TABLE_NAME+(+KEY_ID+
integer primary key autoincrement,+KEY_NAME+ text not null,+
KEY_NUMBER+ text not null);;
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL(DROP TABLE IF EXISTS + TABLE_NAME);
onCreate(sqLiteDatabase);
}
public void addContact(Contact Contact){
SQLiteDatabase db=this.getWritableDatabase();
//使用ContentValues添加數據
ContentValues values=new ContentValues();
values.put(KEY_NAME,student.getName());
values.put(KEY_GRADE,student.getGrade());
db.insert(TABLE_NAME, null, values);
db.close();
}
public Contact getContact(String name){
SQLiteDatabase db=this.getWritableDatabase();
//Cursor對象返回查詢結果
Cursor cursor=db.query(TABLE_NAME,new String[]{KEY_ID,KEY_NAME,KEY_NUMBER},
KEY_NAME+=?,new String[]{name},null,null,null,null);
Contact contact=null;
//注意返回結果有可能為空
if(cursor.moveToFirst()){
student=new Contact(cursor.getInt(0),cursor.getString(1), cursor.getString(2));
}
return contact;
}
public int getContactCounts(){
String selectQuery=SELECT * FROM +TABLE_NAME;
SQLiteDatabase db=this.getReadableDatabase();
Cursor cursor=db.rawQuery(selectQuery,null);
cursor.close();
return cursor.getCount();
}
public List getALllContact(){
List contactList=new ArrayList();
String selectQuery=SELECT * FROM +TABLE_NAME;
SQLiteDatabase db=this.getReadableDatabase();
Cursor cursor=db.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
do{
Contact contact=new Contact();
contact.setId(Integer.parseInt(cursor.getString(0)));
contact.setName(cursor.getString(1));
contact.setNumber(cursor.getString(2));
contactList.add(contact);
}while(cursor.moveToNext());
}
return contactList;
}
public int updateContact(Contact contact){
SQLiteDatabase db=this.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(KEY_NAME,contact.getName());
values.put(KEY_GRADE,contact.getNumber());
return db.update(TABLE_NAME,values,KEY_ID+=?,new String[]{String.valueOf(contact.getId())});
}
public void deleteStudent(Contact contact){
SQLiteDatabase db=this.getWritableDatabase();
db.delete(TABLE_NAME,KEY_ID+=?,new String[]{String.valueOf(contact.getId())});
db.close();
}
現在已經掌握了基本的數據庫操作,作為練習,實現簡單的學生管理,限於篇幅就放到下篇文章了Android 數據存儲 利用SQLiteDatabase實現簡單的學生管理
Android中的設計模式-單例模式單例模式算是比較常用的模式,在Java中如果想要一個JVM中只存在某個類的一個實例,就需要使用到單例模式,而只存在一個實例的需求一般是
在Android 4.4系統中,外置存儲卡(SD卡)被稱為二級外部存儲設備(secondary storage),應用程序已無法往外置存儲卡(SD卡)寫入數據,並且WRI
acitivyt 是什麼 引用官方的說法: 是一個應用組件,用戶可與其提供的屏幕進行交互,以執行撥打電話、拍攝照片、發送電子郵件或查看地圖等操作。 每個 Activity
2014新年第一天,全面升級安卓開發環境。主要做兩件事:1. 把IDE從eclipse轉到Android Studio(又去掉了一個與IBM Rational的聯系,多少