Himi 原創(chuàng), 歡迎轉載,轉載請在明顯處注明! 謝謝。
原文地址: http://blog.csdn.net/xiaominghimi/archive/2011/01/04/6114629.aspx
上一篇跟各位童鞋介紹了SharedPreference 和 File流如何存儲數據,并且推薦使用FileOutputStream/FileInputStream來存儲咱們游戲數據,那么這一篇則是像大家介紹另外一種適合游戲數據存儲的方式:SQLite 輕量級數據庫!
先介紹幾個基本概念知識:
什么是SQLite:
SQLite是一款輕量級數據庫,它的設計目的是嵌入式,而且它占用的資源非常少,在嵌入式設備中,只需要幾百KB!!!!!
SQLite的特性:
-
輕量級
使用 SQLite 只需要帶一個動態(tài)庫,就可以享受它的全部功能,而且那個動態(tài)庫的尺寸想當小。
-
獨立性
SQLite 數據庫的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。
-
隔離性
SQLite 數據庫中所有的信息(比如表、視圖、觸發(fā)器等)都包含在一個文件夾內,方便管理和維護。
-
跨平臺
SQLite 目前支持大部分操作系統(tǒng),不至電腦操作系統(tǒng)更在眾多的手機系統(tǒng)也是能夠運行,比如:Android。
-
多語言接口
SQLite 數據庫支持多語言編程接口。
-
安全性
SQLite 數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只能有一個可以寫入數據.
優(yōu)點:1.能存儲較多的數據。
2.能將數據庫文件存放到SD卡中!
什么是 SQLiteDatabase?
一個 SQLiteDatabase 的實例代表了一個SQLite 的數據庫,通過SQLiteDatabase 實例的一些方法,我們可以執(zhí)行SQL 語句,對數 據庫進行增、刪、查、改的操作。需要注意的是,數據庫對于一個應用來說是私有的,并且在一個應用當中,數據庫的名字也是惟一的。
什么是 SQLiteOpenHelper ?
根據這名字,我們可以看出這個類是一個輔助類。這個類主要生成一個數據庫,并對數據庫的版本進行管理。當在程序當中調用這個類的 方法getWritableDatabase(),或者getReadableDatabase()方法的時候,如果當時沒有數據,那么Android 系統(tǒng)就會自動生成一 個數 據庫。SQLiteOpenHelper 是一個抽象類,我們通常需要繼承它,并且實現里邊的3 個函數,
什么是 ContentValues 類?
ContentValues 類和Hashmap/Hashtable 比較類似,它也是負責存儲一些名值對,但是它存儲的名值對當中的名是一個
String 類型,而值都是基本類型。
什么是 Cursor ?
Cursor 在Android 當中是一個非常有用的接口,通過Cursor 我們可以對從數據庫查詢出來的結果集進行隨機的讀寫訪問。
OK,基本知識就介紹到這里,下面開始上代碼:還是按照我的一貫風格,代碼中該解釋的地方都已經在代碼中及時注釋和講解了!
順便來張項目截圖:
先給出xml:
xml中定義了我們需要練習用到的幾個操作按鈕,這里不多解釋了,下面看java源碼:先看我們繼承的SQLiteOpenHelper 類
我喜歡代碼中立即附上解釋, 感覺這樣代碼 比較讓大家更容易理解和尋找,當然如果童鞋們不喜歡,可以告訴我,我改~嘿嘿~
下面看最重要的MainActivity中的代碼:
以上代碼中我們實現了兩種存儲方式:
一種存儲默認系統(tǒng)路徑/data-data-com.himi-databases下,另外一種則是保存在了/sdcard-himi下,生成數據庫文件himi.db
那么這里兩種實現方式大概步驟和區(qū)別說下:
----------- 如果我們使用默認系統(tǒng)路徑存儲數據庫文件:
第一步:新建一個類繼承SQLiteOpenHelper;寫一個構造,重寫兩個函數!
第二步:在新建的類中的onCreate(SQLiteDatabase db) 方法中創(chuàng)建一個表;
第三步:在進行刪除數據、添加數據等操作的之前我們要得到數據庫讀寫句柄得到一個數據庫實例;
注意: 繼承寫這個輔助類,是為了在我們沒有數據庫的時候自動為我們生成一個數據庫,并且生成數據庫文件,這里也同時創(chuàng)建了一張表,因為我們在onCreate里是在數據庫中創(chuàng)建一張表的操作;這里還要注意在我們new 這個我們這個MySQLiteOpenHelper 類實例對象的時候并沒有創(chuàng)建數據庫喲~!而是在我們調用 ( 備注3) MySQLiteOpenHelper ..getWritableDatabase() 這個方法得到數據庫讀寫句柄的時候,android 會分析是否已經有了數據庫, 如果沒有會默認為我們創(chuàng)建一個數據庫并且在系統(tǒng)路徑data-data-com.himi-databases下生成himi.db 文件!
(如果我們使用sd卡存儲數據庫文件,就沒有必要寫這個類了,而是我們自己Open自己的文件得到一個數據庫,西西,反而方便~ )
-----------如果我們需要把數據庫文件存儲到SD卡中:
第一步:確認模擬器存在SD卡,關于SD卡的兩種創(chuàng)建方法見我的博文:【Android 2D游戲開發(fā)之十】
第二步: (備注1) 先創(chuàng)建SD卡目錄和路徑已經我們的數據庫文件!這里不像上面默認路徑中的那樣,如果沒有數據庫會默認系統(tǒng)路徑生成一個數據庫和一個數據庫文件!我們必須手動創(chuàng)建數據庫文件!
第三步:在進行刪除數據、添加數據等操作的之前我們要得到數據庫讀寫句柄得到一個數據庫實例; (備注2) 此時的創(chuàng)建也不是像系統(tǒng)默認創(chuàng)建,而是我們通過打開第一步創(chuàng)建好的文件得到數據庫實例。這里僅僅是創(chuàng)建一個數據庫?。。。?
第四步:在進行刪除數據、添加數據等操作的之前我們還要創(chuàng)建一個表!
第五步:在配置文件AndroidMainfest.xml 聲明寫入SD卡的權限,上一篇已經介紹權限了,不知道的自己去看下吧。
有些童鞋不理解什么默認路徑方式中就有表?那是因為我們在它默認給我們創(chuàng)建數據庫的時候我們有創(chuàng)建表的操作,就是MySQLiteOpenHelper類中的onCreate()方法里的操作!所以我們如果要在進行刪除數據、添加數據等操作的之前還要創(chuàng)建一個表,創(chuàng)建表的方法都是一樣的。
總結:不管哪種方式我們都要-創(chuàng)建數據庫-創(chuàng)建表-然后進行操作!
備注4:
在Android中查詢數據是通過Cursor類來實現的,當我們使用SQLiteDatabase.query()方法時,會得到一個Cursor對象,Cursor指向的就是每一條數據。它提供了很多有關查詢的方法,具體方法如下:
以下是方法和說明:
move 以當前的位置為參考,將Cursor移動到指定的位置,成功返回true, 失敗返回false
moveToPosition 將Cursor移動到指定的位置,成功返回true,失敗返回false
moveToNext 將Cursor向前移動一個位置,成功返回true,失敗返回false
moveToLast 將Cursor向后移動一個位置,成功返回true,失敗返回 false。
movetoFirst 將Cursor移動到第一行,成功返回true,失敗返回false
isBeforeFirst 返回Cursor是否指向第一項數據之前
isAfterLast 返回Cursor是否指向最后一項數據之后
isClosed 返回Cursor是否關閉
isFirst 返回Cursor是否指向第一項數據
isLast 返回Cursor是否指向最后一項數據
isNull 返回指定位置的值是否為null
getCount 返回總的數據項數
getInt 返回當前行中指定的索引數據
對于SQLite的很多童鞋有接觸過,但是就不知道怎么存儲在SD中,所以我也研究了下,這篇也寫了把sd卡中的方式也提供給大家。
(推薦大家訂閱本博客,因為咱的更新速度可是很快的~娃哈哈)
本篇源碼: http://download.csdn.net/source/2959222
【Android游戲開發(fā)十三】(保存游戲數據 [下文])詳解SQLite存儲方式,并把SQLite的數據庫文件存儲在SD卡中!?。?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
