日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式

發(fā)布時(shí)間:2025/3/15 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ?上一篇跟各位童鞋介紹了SharedPreference 和 File流如何存儲(chǔ)數(shù)據(jù),并且推薦使用FileOutputStream/FileInputStream來(lái)存儲(chǔ)咱們游戲數(shù)據(jù),那么這一篇?jiǎng)t是像大家介紹另外一種適合游戲數(shù)據(jù)存儲(chǔ)的方式:SQLite 輕量級(jí)數(shù)據(jù)庫(kù)!

???? 先介紹幾個(gè)基本概念知識(shí):?

什么是SQLite:

??? SQLite是一款輕量級(jí)數(shù)據(jù)庫(kù),它的設(shè)計(jì)目的是嵌入式,而且它占用的資源非常少,在嵌入式設(shè)備中,只需要幾百KB!!!!!?

SQLite的特性:?

  • 輕量級(jí)
    使用 SQLite 只需要帶一個(gè)動(dòng)態(tài)庫(kù),就可以享受它的全部功能,而且那個(gè)動(dòng)態(tài)庫(kù)的尺寸想當(dāng)小。
  • 獨(dú)立性
    SQLite 數(shù)據(jù)庫(kù)的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。
  • 隔離性
    SQLite 數(shù)據(jù)庫(kù)中所有的信息(比如表、視圖、觸發(fā)器等)都包含在一個(gè)文件夾內(nèi),方便管理和維護(hù)。
  • 跨平臺(tái)
    SQLite 目前支持大部分操作系統(tǒng),不至電腦操作系統(tǒng)更在眾多的手機(jī)系統(tǒng)也是能夠運(yùn)行,比如:Android。
  • 多語(yǔ)言接口
    SQLite 數(shù)據(jù)庫(kù)支持多語(yǔ)言編程接口。
  • 安全性
    SQLite 數(shù)據(jù)庫(kù)通過(guò)數(shù)據(jù)庫(kù)級(jí)上的獨(dú)占性和共享鎖來(lái)實(shí)現(xiàn)獨(dú)立事務(wù)處理。這意味著多個(gè)進(jìn)程可以在同一時(shí)間從同一數(shù)據(jù)庫(kù)讀取數(shù)據(jù),但只能有一個(gè)可以寫入數(shù)據(jù).

優(yōu)點(diǎn):1.能存儲(chǔ)較多的數(shù)據(jù)。

2.能將數(shù)據(jù)庫(kù)文件存放到SD卡中!?

什么是 SQLiteDatabase?

??? 一個(gè) SQLiteDatabase 的實(shí)例代表了一個(gè)SQLite 的數(shù)據(jù)庫(kù),通過(guò)SQLiteDatabase 實(shí)例的一些方法,我們可以執(zhí)行SQL 語(yǔ)句,對(duì)數(shù) 據(jù)庫(kù)進(jìn)行增、刪、查、改的操作。需要注意的是,數(shù)據(jù)庫(kù)對(duì)于一個(gè)應(yīng)用來(lái)說(shuō)是私有的,并且在一個(gè)應(yīng)用當(dāng)中,數(shù)據(jù)庫(kù)的名字也是惟一的。

?什么是 SQLiteOpenHelper ?

??? 根據(jù)這名字,我們可以看出這個(gè)類是一個(gè)輔助類。這個(gè)類主要生成一個(gè)數(shù)據(jù)庫(kù),并對(duì)數(shù)據(jù)庫(kù)的版本進(jìn)行管理。當(dāng)在程序當(dāng)中調(diào)用這個(gè)類的 方法getWritableDatabase(),或者getReadableDatabase()方法的時(shí)候,如果當(dāng)時(shí)沒有數(shù)據(jù),那么Android 系統(tǒng)就會(huì)自動(dòng)生成一 個(gè)數(shù) 據(jù)庫(kù)。SQLiteOpenHelper 是一個(gè)抽象類,我們通常需要繼承它,并且實(shí)現(xiàn)里邊的3 個(gè)函數(shù),

?什么是 ContentValues 類?

??? ContentValues 類和Hashmap/Hashtable 比較類似,它也是負(fù)責(zé)存儲(chǔ)一些名值對(duì),但是它存儲(chǔ)的名值對(duì)當(dāng)中的名是一個(gè)String 類型,而值都是基本類型。

?什么是 Cursor ?

??? Cursor 在Android 當(dāng)中是一個(gè)非常有用的接口,通過(guò)Cursor 我們可以對(duì)從數(shù)據(jù)庫(kù)查詢出來(lái)的結(jié)果集進(jìn)行隨 機(jī)的讀寫訪問(wèn)。

???? OK,基本知識(shí)就介紹到這里,下面開始上代碼:還是按照我的一貫風(fēng)格,代碼中該解釋的地方都已經(jīng)在代碼中及時(shí)注釋和講解了!

順便來(lái)張項(xiàng)目截圖:?

?先給出xml:?

  • <?xml?version="1.0"?encoding="utf-8"?>?
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?
  • ????android:orientation="vertical"?android:layout_width="fill_parent"?
  • ????android:layout_height="fill_parent">?
  • ????<TextView?android:layout_width="fill_parent"?
  • ????????android:layout_height="wrap_content"?android:text="SQL?練習(xí)!(如果你使用的SD卡存儲(chǔ)數(shù)據(jù)方式,為了保證正常操作,請(qǐng)你先點(diǎn)擊創(chuàng)建一張表然后再操作)"?
  • ????????android:textSize="20sp"?android:textColor="#ff0000"?android:id="@+id/tv_title"?/>?
  • ????<Button?android:id="@+id/sql_addOne"?android:layout_width="fill_parent"?
  • ????????android:layout_height="wrap_content"?android:text="插入一條記錄"></Button>?
  • ????<Button?android:id="@+id/sql_check"?android:layout_width="fill_parent"? ?
  • ????????android:layout_height="wrap_content"?android:text="查詢數(shù)據(jù)庫(kù)"></Button>?
  • ????<Button?android:id="@+id/sql_edit"?android:layout_width="fill_parent"?
  • ????????android:layout_height="wrap_content"?android:text="修改一條記錄"></Button>?
  • ????<Button?android:id="@+id/sql_deleteOne"?android:layout_width="fill_parent"?
  • ????????android:layout_height="wrap_content"?android:text="刪除一條記錄"></Button>?
  • ????<Button?android:id="@+id/sql_deleteTable"?android:layout_width="fill_parent"?
  • ????????android:layout_height="wrap_content"?android:text="刪除數(shù)據(jù)表單"></Button>?
  • ????<Button?android:id="@+id/sql_newTable"?android:layout_width="fill_parent"?
  • ????????android:layout_height="wrap_content"?android:text="新建數(shù)據(jù)表單"></Button>?
  • </LinearLayout>?
  • ??????xml中定義了我們需要練習(xí)用到的幾個(gè)操作按鈕,這里不多解釋了,下面看java源碼:先看我們繼承的 SQLiteOpenHelper 類?

  • package?com.himi; ?
  • import?android.content.Context; ?
  • import?android.database.sqlite.SQLiteDatabase; ?
  • import?android.database.sqlite.SQLiteOpenHelper; ?
  • import?android.util.Log; ?
  • /** ?
  • ?*? ?
  • ?*?@author?Himi ?
  • ?*?@解釋?此類我們只需要傳建一個(gè)構(gòu)造函數(shù)?以及重寫兩個(gè)方法就OK啦、 ?
  • ?*? ?
  • ?*/ ?
  • public?class?MySQLiteOpenHelper?extends?SQLiteOpenHelper?{ ?
  • ????public?final?static?int?VERSION?=?1;//?版本號(hào) ?
  • ????public?final?static?String?TABLE_NAME?=?"himi";//?表名 ?
  • ????public?final?static?String?ID?=?"id";//?后面ContentProvider使用 ?
  • ????public?final?static?String?TEXT?=?"text"; ?
  • ????public?static?final?String?DATABASE_NAME?=?"Himi.db"; ?
  • ????public?MySQLiteOpenHelper(Context?context)?{ ?
  • ????????//?在Android?中創(chuàng)建和打開一個(gè)數(shù)據(jù)庫(kù)都可以使用openOrCreateDatabase?方法來(lái)實(shí)現(xiàn), ?
  • ????????//?因?yàn)樗鼤?huì)自動(dòng)去檢測(cè)是否存在這個(gè)數(shù)據(jù)庫(kù),如果存在則打開,不過(guò)不存在則創(chuàng)建一個(gè)數(shù)據(jù)庫(kù); ?
  • ????????//?創(chuàng)建成功則返回一個(gè)?SQLiteDatabase對(duì)象,否則拋出異常FileNotFoundException。 ?
  • ????????//?下面是來(lái)創(chuàng)建一個(gè)名為"DATABASE_NAME"的數(shù)據(jù)庫(kù),并返回一個(gè)SQLiteDatabase對(duì)象? ?
  • ???????? ?
  • ????????super(context,?DATABASE_NAME,?null,?VERSION);? ?
  • ????}? ?
  • ????@Override ?
  • ????//?在數(shù)據(jù)庫(kù)第一次生成的時(shí)候會(huì)調(diào)用這個(gè)方法,一般我們?cè)谶@個(gè)方法里邊生成數(shù)據(jù)庫(kù)表; ?
  • ????public?void?onCreate(SQLiteDatabase?db)?{? ?
  • ????????String?str_sql?=?"CREATE?TABLE?"?+?TABLE_NAME?+?"("?+?ID ?
  • ????????????????+?"?INTEGER?PRIMARY?KEY?AUTOINCREMENT,"?+?TEXT?+?"?text?);"; ?
  • ????????//?CREATE?TABLE?創(chuàng)建一張表?然后后面是我們的表名 ?
  • ????????//?然后表的列,第一個(gè)是id?方便操作數(shù)據(jù),int類型 ?
  • ????????//?PRIMARY?KEY?是指主鍵?這是一個(gè)int型,用于唯一的標(biāo)識(shí)一行; ?
  • ????????//?AUTOINCREMENT?表示數(shù)據(jù)庫(kù)會(huì)為每條記錄的key加一,確保記錄的唯一性; ?
  • ????????//?最后我加入一列文本?String類型 ?
  • ????????//?----------注意:這里str_sql是sql語(yǔ)句,類似dos命令,要注意空格! ?
  • ????????db.execSQL(str_sql); ?
  • ????????//?execSQL()方法是執(zhí)行一句sql語(yǔ)句 ?
  • ????????//?雖然此句我們生成了一張數(shù)據(jù)庫(kù)表和包含該表的sql.himi文件, ?
  • ????????//?但是要注意?不是方法是創(chuàng)建,是傳入的一句str_sql這句sql語(yǔ)句表示創(chuàng)建!! ?
  • ????} ?
  • ????@Override ?
  • ????public?void?onUpgrade(SQLiteDatabase?db,?int?oldVersion,?int?newVersion)?{ ?
  • ????????//?一般默認(rèn)情況下,當(dāng)我們插入?數(shù)據(jù)庫(kù)就立即更新 ?
  • ????????//?當(dāng)數(shù)據(jù)庫(kù)需要升級(jí)的時(shí)候,Android?系統(tǒng)會(huì)主動(dòng)的調(diào)用這個(gè)方法。 ?
  • ????????//?一般我們?cè)谶@個(gè)方法里邊刪除數(shù)據(jù)表,并建立新的數(shù)據(jù)表, ?
  • ????????//?當(dāng)然是否還需要做其他的操作,完全取決于游戲需求。 ?
  • ????????Log.v("Himi",?"onUpgrade"); ?
  • ????}? ?
  • }???
  • ??????我喜歡代碼中立即附上解釋,感覺這樣代碼比較讓大家更容易理解和尋找,當(dāng)然如果童鞋們不喜歡,可以告訴我,我改~嘿嘿~

    ?????下面看最重要的MainActivity中的代碼:?

  • package?com.himi; ?
  • import?java.io.File; ?
  • import?java.io.IOException; ?
  • import?android.app.Activity; ?
  • import?android.content.ContentValues; ?
  • import?android.database.Cursor; ?
  • import?android.database.sqlite.SQLiteDatabase; ?
  • import?android.os.Bundle; ?
  • import?android.view.View; ?
  • import?android.view.Window; ?
  • import?android.view.WindowManager; ?
  • import?android.view.View.OnClickListener; ?
  • import?android.widget.Button; ?
  • import?android.widget.TextView; ?
  • //?------------第三種保存方式--------《SQLite》--------- ?
  • /** ?
  • ?*?@author?Himi ?
  • ?*?@保存方式:SQLite?輕量級(jí)數(shù)據(jù)庫(kù)、 ?
  • ?*?@優(yōu)點(diǎn):?可以將自己的數(shù)據(jù)存儲(chǔ)到文件系統(tǒng)或者數(shù)據(jù)庫(kù)當(dāng)中,?也可以將自己的數(shù)據(jù)存 ?
  • ?*?????????儲(chǔ)到SQLite數(shù)據(jù)庫(kù)當(dāng)中,還可以存到SD卡中 ?
  • ?*?@注意1:數(shù)據(jù)庫(kù)對(duì)于一個(gè)游戲(一個(gè)應(yīng)用)來(lái)說(shuō)是私有的,并且在一個(gè)游戲當(dāng)中,? ?
  • ?*?????????數(shù)據(jù)庫(kù)的名字也是唯一的。 ?
  • ?*?@注意2?apk中創(chuàng)建的數(shù)據(jù)庫(kù)外部的進(jìn)程是沒有權(quán)限去讀/寫的,? ?
  • ?*?????????我們需要把數(shù)據(jù)庫(kù)文件創(chuàng)建到sdcard上可以解決類似問(wèn)題. ?
  • ?*?@注意3?當(dāng)你刪除id靠前的數(shù)據(jù)或者全部刪除數(shù)據(jù)的時(shí)候,SQLite不會(huì)自動(dòng)排序, ?
  • ?*????????也就是說(shuō)再添加數(shù)據(jù)的時(shí)候你不指定id那么SQLite默認(rèn)還是在原有id最后添加一條新數(shù)據(jù) ?
  • ?*?@注意4?android?中?的SQLite?語(yǔ)法大小寫不敏感,也就是說(shuō)不區(qū)分大小寫; ?
  • ?*??? ?
  • ?*/ ?
  • public?class?MainActivity?extends?Activity?implements?OnClickListener?{ ?
  • ????private?Button?btn_addOne,?btn_deleteone,?btn_check,?btn_deleteTable, ?
  • ????????????btn_edit,?btn_newTable; ?
  • ????private?TextView?tv; ?
  • ????private?MySQLiteOpenHelper?myOpenHelper;//?創(chuàng)建一個(gè)繼承SQLiteOpenHelper類實(shí)例 ?
  • ????private?SQLiteDatabase?mysql?;? ?
  • //---------------以下兩個(gè)成員變量是針對(duì)在SD卡中存儲(chǔ)數(shù)據(jù)庫(kù)文件使用 ?
  • //??private?File?path?=?new?File("/sdcard/himi");//?創(chuàng)建目錄 ?
  • //??private?File?f?=?new?File("/sdcard/himi/himi.db");//?創(chuàng)建文件 ?
  • ????@Override ?
  • ????public?void?onCreate(Bundle?savedInstanceState)?{ ?
  • ????????super.onCreate(savedInstanceState); ?
  • ????????getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, ?
  • ????????????????WindowManager.LayoutParams.FLAG_FULLSCREEN); ?
  • ????????this.requestWindowFeature(Window.FEATURE_NO_TITLE); ?
  • ????????setContentView(R.layout.main); ?
  • ????????tv?=?(TextView)?findViewById(R.id.tv_title); ?
  • ????????btn_addOne?=?(Button)?findViewById(R.id.sql_addOne); ?
  • ????????btn_check?=?(Button)?findViewById(R.id.sql_check); ?
  • ????????btn_deleteone?=?(Button)?findViewById(R.id.sql_deleteOne); ?
  • ????????btn_deleteTable?=?(Button)?findViewById(R.id.sql_deleteTable); ?
  • ????????btn_newTable?=?(Button)?findViewById(R.id.sql_newTable); ?
  • ????????btn_edit?=?(Button)?findViewById(R.id.sql_edit); ?
  • ????????btn_edit.setOnClickListener(this); ?
  • ????????btn_addOne.setOnClickListener(this); ?
  • ????????btn_check.setOnClickListener(this); ?
  • ????????btn_deleteone.setOnClickListener(this); ?
  • ????????btn_deleteTable.setOnClickListener(this); ?
  • ????????btn_newTable.setOnClickListener(this); ?
  • ????????myOpenHelper?=?new?MySQLiteOpenHelper(this);//?實(shí)例一個(gè)數(shù)據(jù)庫(kù)輔助器 ?
  • //備注1??----如果你使用的是將數(shù)據(jù)庫(kù)的文件創(chuàng)建在SD卡中,那么創(chuàng)建數(shù)據(jù)庫(kù)mysql如下操作: ?
  • //??????if?(!path.exists())?{//?目錄存在返回false ?
  • //??????????path.mkdirs();//?創(chuàng)建一個(gè)目錄 ?
  • //??????} ?
  • //??????if?(!f.exists())?{//?文件存在返回false ?
  • //??????????try?{ ?
  • //??????????????f.createNewFile();//創(chuàng)建文件? ?
  • //??????????}?catch?(IOException?e)?{ ?
  • //??????????????//?TODO?Auto-generated?catch?block ?
  • //??????????????e.printStackTrace(); ?
  • //??????????} ?
  • //??????}? ?
  • ????} ?
  • ????@Override ?
  • ????public?void?onClick(View?v)?{?? ?
  • ????????try?{? ?
  • //備注2----如果你使用的是將數(shù)據(jù)庫(kù)的文件創(chuàng)建在SD卡中,那么創(chuàng)建數(shù)據(jù)庫(kù)mysql如下操作: ?
  • //??????????????mysql?=?SQLiteDatabase.openOrCreateDatabase(f,?null);? ?
  • //備注3---?如果想把數(shù)據(jù)庫(kù)文件默認(rèn)放在系統(tǒng)中,那么創(chuàng)建數(shù)據(jù)庫(kù)mysql如下操作: ?
  • ????????????????mysql?=?myOpenHelper.getWritableDatabase();?//?實(shí)例數(shù)據(jù)庫(kù) ?
  • ????????????if?(v?==?btn_addOne)?{//?添加數(shù)據(jù) ?
  • ????????????????//?----------------------?讀寫句柄來(lái)插入--------- ?
  • ????????????????//?ContentValues?其實(shí)就是一個(gè)哈希表HashMap,?key值是字段名稱, ?
  • ????????????????//Value值是字段的值。然后?通過(guò)?ContentValues?的?put?方法就可以 ?
  • ????????????????//把數(shù)據(jù)放到ContentValues中,然后插入到表中去! ?
  • ????????????????ContentValues?cv?=?new?ContentValues(); ?
  • ????????????????cv.put(MySQLiteOpenHelper.TEXT,?"測(cè)試新的數(shù)據(jù)"); ?
  • ????????????????mysql.insert(MySQLiteOpenHelper.TABLE_NAME,?null,?cv); ?
  • ????????????????//?inser()?第一個(gè)參數(shù)?標(biāo)識(shí)需要插入操作的表名 ?
  • ????????????????//?第二個(gè)參數(shù)?:默認(rèn)傳null即可 ?
  • ????????????????//?第三個(gè)是插入的數(shù)據(jù) ?
  • ????????????????//?----------------------?SQL語(yǔ)句插入-------------- ?
  • ????????????????//?String?INSERT_DATA?= ?
  • ????????????????//?"INSERT?INTO?himi?(id,text)?values?(1,?'通過(guò)SQL語(yǔ)句插入')"; ?
  • ????????????????//?db.execSQL(INSERT_DATA); ?
  • ????????????????tv.setText("添加數(shù)據(jù)成功!點(diǎn)擊查看數(shù)據(jù)庫(kù)查詢"); ?
  • ????????????}?else?if?(v?==?btn_deleteone)?{//?刪除數(shù)據(jù) ?
  • ????????????????//?----------------------?讀寫句柄來(lái)刪除 ?
  • ????????????????mysql.delete("himi",?MySQLiteOpenHelper.ID?+?"=1",?null); ?
  • ????????????????//?第一個(gè)參數(shù)?需要操作的表名 ?
  • ????????????????//?第二個(gè)參數(shù)為?id+操作的下標(biāo)?如果這里我們傳入null,表示全部刪除 ?
  • ????????????????//?第三個(gè)參數(shù)默認(rèn)傳null即可 ?
  • ????????????????//?-----------------------?SQL語(yǔ)句來(lái)刪除 ?
  • ????????????????//?String?DELETE_DATA?=?"DELETE?FROM?himi?WHERE?id=1"; ?
  • ????????????????//?db.execSQL(DELETE_DATA); ?
  • ????????????????tv.setText("刪除數(shù)據(jù)成功!點(diǎn)擊查看數(shù)據(jù)庫(kù)查詢"); ?
  • ????????????}?else?if?(v?==?btn_check)?{//?遍歷數(shù)據(jù) ?
  • //備注4------ ?
  • ????????????????Cursor?cur?=?mysql.rawQuery("SELECT?*?FROM?" ?
  • ????????????????????????+?MySQLiteOpenHelper.TABLE_NAME,?null); ?
  • ????????????????if?(cur?!=?null)?{ ?
  • ????????????????????String?temp?=?""; ?
  • ????????????????????int?i?=?0; ?
  • ????????????????????while?(cur.moveToNext())?{//直到返回false說(shuō)明表中到了數(shù)據(jù)末尾 ?
  • ????????????????????????temp?+=?cur.getString(0);? ?
  • ????????????????????????//?參數(shù)0?指的是列的下標(biāo),這里的0指的是id列 ?
  • ????????????????????????temp?+=?cur.getString(1); ?
  • ????????????????????????//?這里的0相對(duì)于當(dāng)前應(yīng)該是咱們的text列了 ?
  • ????????????????????????i++; ?
  • ????????????????????????temp?+=?"??";?//?這里是我整理顯示格式?,呵呵~ ?
  • ????????????????????????if?(i?%?3?==?0)?//?這里是我整理顯示格式?,呵呵~ ?
  • ????????????????????????????temp?+=?"/n";//?這里是我整理顯示格式?,呵呵~ ?
  • ????????????????????} ?
  • ????????????????????tv.setText(temp); ?
  • ????????????????} ?
  • ????????????}?else?if?(v?==?btn_edit)?{//?修改數(shù)據(jù) ?
  • ????????????????//?------------------------句柄方式來(lái)修改?------------- ?
  • ????????????????ContentValues?cv?=?new?ContentValues(); ?
  • ????????????????cv.put(MySQLiteOpenHelper.TEXT,?"修改后的數(shù)據(jù)"); ?
  • ????????????????mysql.update("himi",?cv,?"id?"?+?"="?+?Integer.toString(3),?null); ?
  • ????????????????//?------------------------SQL語(yǔ)句來(lái)修改?------------- ?
  • ????????????????//?String?UPDATA_DATA?= ?
  • ????????????????//?"UPDATE?himi?SET?text='通過(guò)SQL語(yǔ)句來(lái)修改數(shù)據(jù)'??WHERE?id=1"; ?
  • ????????????????//?db.execSQL(UPDATA_DATA); ?
  • ????????????????tv.setText("修改數(shù)據(jù)成功!點(diǎn)擊查看數(shù)據(jù)庫(kù)查詢"); ?
  • ????????????}?else?if?(v?==?btn_deleteTable)?{//?刪除表 ?
  • ????????????????mysql.execSQL("DROP?TABLE?himi"); ?
  • ????????????????tv.setText("刪除表成功!點(diǎn)擊查看數(shù)據(jù)庫(kù)查詢"); ?
  • ????????????}?else?if?(v?==?btn_newTable)?{//?新建表 ?
  • ????????????????String?TABLE_NAME?=?"himi"; ?
  • ????????????????String?ID?=?"id"; ?
  • ????????????????String?TEXT?=?"text"; ?
  • ????????????????String?str_sql2?=?"CREATE?TABLE?"?+?TABLE_NAME?+?"("?+?ID ?
  • ????????????????????????+?"?INTEGER?PRIMARY?KEY?AUTOINCREMENT,"?+?TEXT ?
  • ????????????????????????+?"?text?);"; ?
  • ????????????????mysql.execSQL(str_sql2); ?
  • ????????????????tv.setText("新建表成功!點(diǎn)擊查看數(shù)據(jù)庫(kù)查詢"); ?
  • ????????????} ?
  • ????????????//?刪除數(shù)據(jù)庫(kù): ?
  • ????????????//?this.deleteDatabase("himi.db"); ?
  • ????????}?catch?(Exception?e)?{ ?
  • ????????????tv.setText("操作失敗!"); ?
  • ????????}?finally?{//?如果try中異常,也要對(duì)數(shù)據(jù)庫(kù)進(jìn)行關(guān)閉 ?
  • ????????????mysql.close(); ?
  • ????????} ?
  • ????} ?
  • }?
  • ????? 以上代碼中我們實(shí)現(xiàn)了兩種存儲(chǔ)方式:

    ??? 一種存儲(chǔ)默認(rèn)系統(tǒng)路徑/data-data-com.himi-databases下,另外一種則是保存在了/sdcard-himi下,生成數(shù)據(jù)庫(kù)文件himi.db

    ???? 那么這里兩種實(shí)現(xiàn)方式大概步驟和區(qū)別說(shuō)下:?

    -----------如果我們使用默認(rèn)系統(tǒng)路徑存儲(chǔ)數(shù)據(jù)庫(kù)文件:

    ??? 第一步:新建一個(gè)類繼承SQLiteOpenHelper;寫一個(gè)構(gòu)造,重寫兩個(gè)函數(shù)!

    ??? 第二步:在新建的類中的onCreate(SQLiteDatabase db) 方法中創(chuàng)建一個(gè)表;

    ??? 第三步:在進(jìn)行刪除數(shù)據(jù)、添加數(shù)據(jù)等操作的之前我們要得到數(shù)據(jù)庫(kù)讀寫句柄得到一個(gè)數(shù)據(jù)庫(kù)實(shí)例;

    ??? 注意:?繼承寫這個(gè)輔助類,是為了在我們沒有數(shù)據(jù)庫(kù)的時(shí)候自動(dòng)為我們生成一個(gè)數(shù)據(jù)庫(kù),并且生成數(shù)據(jù)庫(kù)文件,這里也同時(shí)創(chuàng)建了一張表,因?yàn)槲覀冊(cè)趏nCreate里是在數(shù)據(jù)庫(kù)中創(chuàng)建一張表的操作;這里還要注意在我們new 這個(gè)我們這個(gè)MySQLiteOpenHelper 類實(shí)例對(duì)象的時(shí)候并沒有創(chuàng)建數(shù)據(jù)庫(kù)喲~!而是在我們調(diào)用?(備注3)MySQLiteOpenHelper ..getWritableDatabase() 這個(gè)方法得到數(shù)據(jù)庫(kù)讀寫句柄的時(shí)候,android 會(huì)分析是否已經(jīng)有了數(shù)據(jù)庫(kù),如果沒有會(huì)默認(rèn)為我們創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)并且在系統(tǒng)路徑data-data-com.himi-databases下生成himi.db 文件!(如果我們使用sd卡存儲(chǔ)數(shù)據(jù)庫(kù)文件,就沒有必要寫這個(gè)類了,而是我們自己Open自己的文件得到一個(gè)數(shù)據(jù)庫(kù),西西,反而方便~ )

    ?-----------如果我們需要把數(shù)據(jù)庫(kù)文件存儲(chǔ)到SD卡中:

    ??? 第一步:確認(rèn)模擬器存在SD卡,關(guān)于SD卡的兩種創(chuàng)建方法見我的博文:【Android 2D游戲開發(fā)之十】

    ??? 第二步:(備注1)先創(chuàng)建SD卡目錄和路徑已經(jīng)我們的數(shù)據(jù)庫(kù)文件!這里不像上面默認(rèn)路徑中的那樣,如果沒有數(shù)據(jù)庫(kù)會(huì)默認(rèn)系統(tǒng)路徑生成一個(gè)數(shù)據(jù)庫(kù)和一個(gè)數(shù)據(jù)庫(kù)文件!我們必須手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)文件!

    ??? 第三步:在進(jìn)行刪除數(shù)據(jù)、添加數(shù)據(jù)等操作的之前我們要得到數(shù)據(jù)庫(kù)讀寫句柄得到一個(gè)數(shù)據(jù)庫(kù)實(shí)例;(備注2)此時(shí)的創(chuàng)建也不是像系統(tǒng)默認(rèn)創(chuàng)建,而是我們通過(guò)打開第一步創(chuàng)建好的文件得到數(shù)據(jù)庫(kù)實(shí)例。這里僅僅是創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)!!!!

    ??? 第四步:在進(jìn)行刪除數(shù)據(jù)、添加數(shù)據(jù)等操作的之前我們還要?jiǎng)?chuàng)建一個(gè)表!

    ??? 第五步:在配置文件AndroidMainfest.xml 聲明寫入SD卡的權(quán)限,上一篇已經(jīng)介紹權(quán)限了,不知道的自己去看下吧。

    ??? 有些童鞋不理解什么默認(rèn)路徑方式中就有表?那是因?yàn)槲覀冊(cè)谒J(rèn)給我們創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候我們有創(chuàng)建表的操作,就是MySQLiteOpenHelper類中的onCreate()方法里的操作!所以我們?nèi)绻谶M(jìn)行刪除數(shù)據(jù)、添加數(shù)據(jù)等操作的之前還要?jiǎng)?chuàng)建一個(gè)表,創(chuàng)建表的方法都是一樣的。?

    ??? 總結(jié):不管哪種方式我們都要-創(chuàng)建數(shù)據(jù)庫(kù)-創(chuàng)建表-然后進(jìn)行操作!?

    備注4:

    ??? 在Android中查詢數(shù)據(jù)是通過(guò)Cursor類來(lái)實(shí)現(xiàn)的,當(dāng)我們使用SQLiteDatabase.query()方法時(shí),會(huì)得到一個(gè)Cursor對(duì)象,Cursor指向的就是每一條數(shù)據(jù)。它提供了很多有關(guān)查詢的方法,具體方法如下:?

    以下是方法和說(shuō)明:?

    move 以當(dāng)前的位置為參考,將Cursor移動(dòng)到指定的位置,成功返回true, 失敗返回false?

    moveToPosition 將Cursor移動(dòng)到指定的位置,成功返回true,失敗返回false?

    moveToNext 將Cursor向前移動(dòng)一個(gè)位置,成功返回true,失敗返回false?

    moveToLast 將Cursor向后移動(dòng)一個(gè)位置,成功返回true,失敗返回 false。?

    movetoFirst 將Cursor移動(dòng)到第一行,成功返回true,失敗返回false?

    isBeforeFirst 返回Cursor是否指向第一項(xiàng)數(shù)據(jù)之前?

    isAfterLast 返回Cursor是否指向最后一項(xiàng)數(shù)據(jù)之后?

    isClosed 返回Cursor是否關(guān)閉?

    isFirst 返回Cursor是否指向第一項(xiàng)數(shù)據(jù)?

    isLast 返回Cursor是否指向最后一項(xiàng)數(shù)據(jù)?

    isNull 返回指定位置的值是否為null

    ?getCount 返回總的數(shù)據(jù)項(xiàng)數(shù)

    ?getInt 返回當(dāng)前行中指定的索引數(shù)據(jù)

    ?????對(duì)于SQLite的很多童鞋有接觸過(guò),但是就不知道怎么存儲(chǔ)在SD中,所以我也研究了下,這篇也寫了把sd卡中的方式也提供給大家。

    ???? OK 這元旦放假幾天就光給大家寫這個(gè)了,呵呵~凌晨2點(diǎn)了,咳咳~該睡覺了。(我一般凌成3點(diǎn)睡覺,早8點(diǎn)起來(lái)上班 呵呵~習(xí)慣了~)









    本文轉(zhuǎn)自 xiaominghimi 51CTO博客,原文鏈接:http://blog.51cto.com/xiaominghimi/606759,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。