編輯:關於Android編程
Android 也提供了幾種方法用來保存數據,使得這些數據即使在程序結束以後依然不會丟失。這些方法有:
文本文件:SDcard保存:
Preferences保存:
這也是一種經常使用的數據存儲方法,因為它們對於用戶而言是透明的,並且從應用安裝的時候就存在了。
Assets保存:
用來存儲一些只讀數據,Assets是指那些在assets目錄下的文件,這些文件在你將你的應用編譯打包之前就要存在,並且可以在應用程序運行的時候被訪問到。
但有時候我們需要對保存的數據進行一些復雜的操作,或者數據量很大,超出了文本文件和Preference的性能能的范圍,所以需要一些更加高效的方法來管理,從Android1.5開始,Android就自帶SQLite數據庫了。
SQLite它是一個獨立的,無需服務進程,支持事務處理,可以使用SQL語言的數據庫。
1、 ACID事務
ACID:
指數據庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易方的要求。
2、 零配置 – 無需安裝和管理配置
3、儲存在單一磁盤文件中的一個完整的數據庫
4、數據庫文件可以在不同字節順序的機器間自由的共享
5、支持數據庫大小至2TB
6、 足夠小, 大致3萬行C代碼, 250K
7、比一些流行的數據庫在大部分普通數據庫操作要快
8、簡單, 輕松的API
9、 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定
http://www.sqlite.org/tclsqlite.html
10、良好注釋的源代碼, 並且有著90%以上的測試覆蓋率
11、 獨立: 沒有額外依賴
12、 Source完全的Open, 你可以用於任何用途, 包括出售它
13、支持多種開發語言,C,PHP,Perl,Java,ASP.NET,Python
Activites 可以通過 Content Provider 或者 Service 訪問一個數據庫。
Android 不自動提供數據庫。在 Android 應用程序中使用 SQLite,必須自己創建數據庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個數據庫,你只要繼承 SQLiteOpenHelper 類根據開發應用程序的需要,封裝創建和更新數據庫使用的邏輯就行了。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
public class DatabaseHelper extends SQLiteOpenHelper {
/**
* @param context 上下文環境(例如,一個 Activity)
* @param name 數據庫名字
* @param factory 一個可選的游標工廠(通常是 Null)
* @param version 數據庫模型版本的整數
*
* 會調用父類 SQLiteOpenHelper的構造函數
*/
public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 在數據庫第一次創建的時候會調用這個方法
*
*根據需要對傳入的SQLiteDatabase 對象填充表和初始化數據。
*/
@Override
public void onCreate(SQLiteDatabase db) {
}
/**
* 當數據庫需要修改的時候(兩個數據庫版本不同),Android系統會主動的調用這個方法。
* 一般我們在這個方法裡邊刪除數據庫表,並建立新的數據庫表.
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號
}
@Override
public void onOpen(SQLiteDatabase db) {
// 每次成功打開數據庫後首先被執行
super.onOpen(db);
}
}
繼承SQLiteOpenHelper之後就擁有了以下兩個方法:
getReadableDatabase() 創建或者打開一個查詢數據庫
getWritableDatabase() 創建或者打開一個可寫數據庫
DatabaseHelper database = new DatabaseHelper(context);//傳入一個上下文參數
SQLiteDatabase db = null;
db = database.getWritableDatabase();
上面這段代碼會返回一個 SQLiteDatabase 類的實例,使用這個對象,你就可以查詢或者修改數據庫。
SQLiteDatabase類為我們提供了很多種方法,而較常用的方法如下:
(int) delete(String table,String whereClause,String[] whereArgs)
刪除數據行
(long) insert(String table,String nullColumnHack,ContentValues values)
添加數據行
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
更新數據行
(void) execSQL(String sql)
執行一個SQL語句,可以是一個select或其他的sql語句
(void) close()
關閉數據庫
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
查詢指定的數據表返回一個帶游標的數據集。
各參數說明:
table:表名稱
colums:列名稱數組
selection:條件子句,相當於where
selectionArgs:條件語句的參數數組
groupBy:分組
having:分組條件
orderBy:排序類
limit:分頁查詢的限制
Cursor:返回值,相當於結果集ResultSet
(Cursor) rawQuery(String sql, String[] selectionArgs)
運行一個預置的SQL語句,返回帶游標的數據集(與上面的語句最大的區別就是防止SQL注入)
當你完成了對數據庫的操作(例如你的 Activity 已經關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉數據庫連接。
為了創建表和索引,需要調用 SQLiteDatabase 的 execSQL() 方法來執行 DDL 語句。如果沒有異常,這個方法沒有返回值。
例如,你可以執行如下代碼:
db.execSQL("CREATE TABLE user(_id INTEGER PRIMARY KEY
AUTOINCREMENT, username TEXT, password TEXT);");
這條語句會創建一個名為 user的表,表有一個列名為 _id,並且是主鍵,這列的值是會自動增長的整數。另外還有兩列:username( 字符 ) 和 password( 字符 )。 SQLite 會自動為主鍵列創建索引。
通常情況下,第一次創建數據庫時創建了表和索引。要 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。
有兩種方法可以給表添加數據。
①可以使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL() 方法適用於所有不返回結果的 SQL 語句。例如:
String sql = "insert into user(username,password) values ('finch','123456');//插入操作的SQL語句
db.execSQL(sql);//執行SQL語句
②使用 SQLiteDatabase 對象的 insert()。
ContentValues cv = new ContentValues();
cv.put("username","finch");//添加用戶名
cv.put("password","123456"); //添加密碼
db.insert("user",null,cv);//執行插入操作
①使用SQLiteDatabase 對象的 update()方法。
ContentValues cv = new ContentValues();
cv.put("password","654321");//添加要更改的字段及內容
String whereClause = "username=?";//修改條件
String[] whereArgs = {"finch"};//修改條件的參數
db.update("user",cv,whereClause,whereArgs);//執行修改
該方法有四個參數:
表名;
列名和值的 ContentValues 對象;
可選的 WHERE 條件;
可選的填充 WHERE 語句的字符串,這些字符串會替換 WHERE 條件中的“?”標記,update() 根據條件,更新指定列的值.
②使用execSQL方式的實現
String sql = "update [user] set password = '654321' where username="finch";//修改的SQL語句
db.execSQL(sql);//執行修改
①使用SQLiteDatabase 對象的delete()方法。
String whereClause = "username=?";//刪除的條件
String[] whereArgs = {"finch"};//刪除的條件參數
db.delete("user",whereClause,whereArgs);//執行刪除
②使用execSQL方式的實現
String sql = "delete from user where username="finch";//刪除操作的SQL語句
db.execSQL(sql);//執行刪除操作
①使用 rawQuery() 直接調用 SELECT 語句
Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"finch"});
if(cursor.moveToFirst()) {
String password = c.getString(c.getColumnIndex("password"));
}
返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。
如果查詢是動態的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用 query() 方法會方便很多。
②通過query實現查詢
query() 方法用 SELECT 語句段構建查詢。
SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要獲取的字段名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。
除了表名,其他參數可以是 null。所以代碼可寫成:
Cursor c = db.query("user",null,null,null,null,null,null);//查詢並獲得游標
if(c.moveToFirst()){//判斷游標是否為空
for(int i=0;i
使用游標
不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 數據庫游標,使用游標,你可以:
通過使用 getCount() 方法得到結果集中有多少記錄;
通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;
通過 getColumnNames() 得到字段名;
通過 getColumnIndex() 轉換成字段號;
通過 getString(),getInt() 等方法得到給定字段當前記錄的值;
通過 requery() 方法重新執行查詢得到游標;
通過 close() 方法釋放游標資源;
例如,下面代碼遍歷 user表:
Cursor result=db.rawQuery("SELECT _id, username, password FROM user");
result.moveToFirst();
while (!result.isAfterLast()) {
int id=result.getInt(0);
String name=result.getString(1);
String password =result.getString(2);
// do something useful with these
result.moveToNext();
}
result.close();
最近因為興趣所向,開始學習OpenGL繪圖。本文以“畫球體”為點,小結一下最近所學。 初識OpenGL ES 接觸OpenGL是從Android開始的。眾所周知,A
概要設計模式是一門藝術,如果真正了解這門藝術,你會發現,世界都將變得更加優美。定義策略模式定義了一系列的算法,並將每一個算法封裝起來,他們之間還可以相互替換,策略模式獨立
從Demo3開始,接下來會介紹Design Support組件庫中幾個常用的組件,首先就先從Design Support Library開始說起。Android Des
主要講解Android Studio中生成aar文件以及本地方式使用aar文件的方法。 在Android Studio中對一個自己庫進行生成操作時將會同時生成*.jar與