編輯:關於Android編程
一、關系型數據庫SQLIte
每個應用程序都要使用數據,Android應用程序也不例外,Android使用開源的、與操作系統無關的SQL數據庫—SQLite。SQLite第一個Alpha版本誕生於2000年5月,它是一款輕量級數據庫,它的設計目標是嵌入式的,占用資源非常的低,只需要幾百K的內存就夠了。SQLite已經被多種軟件和產品使用,Mozilla FireFox就是使用SQLite來存儲配置數據的,Android和iPhone都是使用SQLite來存儲數據的。
SQLite體系結構圖如下:
編譯器包括Tokenizer(詞法分析器)、 Parser(語法分析器)、Code Generator(代碼產生器)。他們協同處理文本形式的結構化查詢語句。
後端由B-tree,Pager,OS Interface組成。B-tree的職責是負責排序,維護多個數據庫頁之間錯綜復雜的關系,將頁面組織成樹狀結構,頁面就是樹的葉子。Pager負責傳輸,根據B-tree的請求從磁盤讀取頁面或者寫入頁面。
公共服務中有各種實用的功能比如:內存分配、字符串比較,Unicode轉換等。
SQLite數據庫是D.Richard Hipp用C語言編寫的開源嵌入式數據庫,支持的數據庫大小為2TB。它具有如下特征:
1、輕量級
SQLite和C\S模式的數據庫軟件不同,它是進程內的數據庫引擎,因此不存在數據庫的客戶端和服務器。使用SQLite一般只需要帶上它的一個動態庫,就可以享受它的全部功能。而且那個動態庫的尺寸也相當小。
2、獨立性
SQLite數據庫的核心引擎本身不依賴第三方軟件,使用它也不需要“安裝”,所以在使用的時候能夠省去不少麻煩。
3、隔離性
SQLite數據庫中的所有信息(比如表、視圖、觸發器)都包含在一個文件內,方便管理和維護。
4、跨平台
SQLite數據庫支持大部分操作系統,除了我們在電腦上使用的操作系統之外,很多手機操作系統同樣可以運行,比如Android、Windows Mobile、Symbian、Palm等。
5、多語言接口
SQLite數據庫支持很多語言編程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多開發者的喜愛。
6、安全性
SQLite數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程向數據庫執行寫操作之前,必須獲得獨占鎖定。在發出獨占鎖定後,其他的讀或寫操作將不會再發生。
SQLite官方網站(http://www.sqlite.org),了解更多內容請前往。
二、導出查看數據庫文件
在android中,為某個應用程序創建的數據庫,只有它可以訪問,其它應用程序是不能訪問的,數據庫位於Android設備/data/data/package_name/databases文件夾中。
想要將數據庫文件導出可以使用eclipse,如圖所示:
查看數據庫,使用SQlite Database Browser,如圖所示:
三、擴展類
3.1擴展SQLiteOpenHelper
Android 不自動提供數據庫。在 Android 應用程序中使用 SQLite,必須自己創建數據庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個數據庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建數據庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新數據庫使用的邏輯。SQLiteOpenHelper 的子類,至少需要實現三個方法:
構造函數,調用父類 SQLiteOpenHelper 的構造函數
onCreate()方法;// TODO 創建數據庫後,對數據庫的操作(如數據庫中的表沒創建,則執行此方法。)
onUpgrage()方法。// TODO 更改數據庫版本的操作(根據版本)
當你完成了對數據庫的操作(例如你的 Activity 已經關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉數據庫連接。
操作數據庫的最佳實踐是創建一個輔助類,例如聯系人模塊
class ContactsDatabaseHelper extends SQLiteOpenHelper
3.2 Cursor類
Android使用Cursor類返回一個需要的值,Cursor作為一個指針從數據庫查詢返回結果集,使用Cursor允許Android更有效地管理它們需要的行和列,你使用ContentValues對象存儲鍵/值對,它的put()方法允許你插入不同數據類型的鍵值。3.3 數據類型
SQLite 和其他數據庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入數據庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字符串(String)放入 INTEGER 列。SQLite 稱這為“弱類型”(manifest typing.)。 具體代碼: 新建一個DBHelp類擴展yuSQLiteOpenHelperpublic class DBHelper extends SQLiteOpenHelper { private final static int DATABASE_VERSION=1;//數據庫版本 private final static String DATABASE_NAME="MyDiary.db";// 數據庫名 public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table myInfo(_id integer primary key autoincrement," + "title text ,date text,content text)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
public class DBService { private DBHelper dbHelper; public DBService(Context context){ this.dbHelper=new DBHelper(context); } //添加信息 public void insert(Info info){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("insert into myInfo values(null,?,?,?)" , new String[] { info.getTitle(), info.getDate(), info.getContent()}); db.close(); } //獲取所有的信息 public List此後就可以在就可以在Activity中調用你所封裝好的方法了。getAll(){ List list=new ArrayList (); SQLiteDatabase db=dbHelper.getWritableDatabase(); Cursor cursor=db.rawQuery("select * from myInfo",null); if (cursor == null) { return list; } while(cursor.moveToNext()){ Info info=new Info(); info.setId(cursor.getInt(cursor.getColumnIndex("_id"))); info.setTitle(cursor.getString(cursor.getColumnIndex("title"))); info.setDate(cursor.getString(cursor.getColumnIndex("date"))); info.setContent(cursor.getString(cursor.getColumnIndex("content"))); list.add(info); } cursor.close(); db.close(); return list; } //更新 public void update( Info info){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("update myInfo set title=?,date=?,content=? where _id=?", new String[] { info.getTitle(), info.getDate(), info.getContent(),info.getId()+"" }); db.close(); } //刪除 public void delete(Info info){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("delete from myInfo where _id=?", new String[] { info.getId() + "" }); db.close(); } //查詢 public List getByTitle(String title) { List list=new ArrayList (); SQLiteDatabase db=dbHelper.getWritableDatabase(); Cursor cursor=db.rawQuery("select * from myInfo where title like ?",new String[]{ "%"+title+"%" }); if (cursor==null){ return list; } while(cursor.moveToNext()){ Info info=new Info(); info.setId(cursor.getInt(cursor.getColumnIndex("_id"))); info.setTitle(cursor.getString(cursor.getColumnIndex("title"))); info.setDate(cursor.getString(cursor.getColumnIndex("date"))); info.setContent(cursor.getString(cursor.getColumnIndex("content"))); list.add(info); } cursor.close(); db.close(); return list; } }
仿映客送小禮物的特效,順便復習一下屬性動畫,話不多說先看效果圖。需求分析可以看到整個動畫有幾部分組成,那我們就把每個部分拆分出來各個擊破。1.要顯示那些內容以及內容間的位
相信很多開發者會把圖片存放到七牛上,我的web站點也是吧圖片存儲到七牛上,對於以圖片為主的站點,這樣可以節省很大帶寬。將圖片上傳到七牛服務器的重點就是獲得上傳憑證uplo
1.屬性動畫概述動畫一直是App增強用戶交互和用戶體驗的一個重要環節,特別是在某些提示場景或者廣告場景中,合理使用動畫可以給用戶帶來更加愉悅的使用體驗,因此我們很有必要掌
LED indicator 簡介所謂的LED indicator就是手機上面充電發短信的燈,有時會亮綠燈,有時會亮紅燈,有時一起亮(橙燈),主要用於提醒用戶電量、短信、電
先占個位置,下次翻譯~ :p Properly stopping a