【Android遊戲開發十三】(保存遊戲數據 [下文])詳解SQLite存儲方式,並把SQLite的數據庫文件存儲在SD卡中!!!

上一篇跟各位童鞋介紹了SharedPreference 和 File流如何存儲數據,而且推薦使用FileOutputStream/FileInputStream來存儲我們遊戲數據,那麼這一篇則是像你們介紹另一種適合遊戲數據存儲的方式:SQLite 輕量級數據庫!java

先介紹幾個基本概念知識:mysql

什麼是SQLite:android

SQLite是一款輕量級數據庫,它的設計目的是嵌入式,並且它佔用的資源很是少,在嵌入式設備中,只須要幾百KB!!!!!sql

SQLite的特性:數據庫

  • 輕量級
    使用 SQLite 只須要帶一個動態庫,就能夠享受它的所有功能,並且那個動態庫的尺寸想當小。
  • 獨立性
    SQLite 數據庫的核心引擎不須要依賴第三方軟件,也不須要所謂的「安裝」。
  • 隔離性
    SQLite 數據庫中全部的信息(好比表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。
  • 跨平臺
    SQLite 目前支持大部分操做系統,不至電腦操做系統更在衆多的手機系統也是可以運行,好比:Android。
  • 多語言接口
    SQLite 數據庫支持多語言編程接口。
  • 安全性
    SQLite 數據庫經過數據庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味着多個進程能夠在同一時間從同一數據庫讀取數據,但只能有一個能夠寫入數據.

優勢:1.能存儲較多的數據。編程

2.能將數據庫文件存放到SD卡中!安全

什麼是 SQLiteDatabase? app

一個 SQLiteDatabase 的實例表明了一個SQLite 的數據庫,經過SQLiteDatabase 實例的一些方法,咱們能夠執行SQL 語句,對數        據庫進行增、刪、查、改的操做。須要注意的是,數據庫對於一個應用來講是私有的,而且在一個應用當中,數據庫的名字也是唯一的。ide

什麼是 SQLiteOpenHelper ?函數

根據這名字,咱們能夠看出這個類是一個輔助類。這個類主要生成一個數據庫,並對數據庫的版本進行管理。當在程序當中調用這個類的        方法getWritableDatabase(),或者getReadableDatabase()方法的時候,若是當時沒有數據,那麼Android 系統就會自動生成一        個數  據庫。SQLiteOpenHelper 是一個抽象類,咱們一般須要繼承它,而且實現裏邊的3 個函數,

什麼是 ContentValues 類?

ContentValues 類和Hashmap/Hashtable 比較相似,它也是負責存儲一些名值對,可是它存儲的名值對當中的名是一個

String 類型,而值都是基本類型。

什麼是 Cursor ?

Cursor 在Android 當中是一個很是有用的接口,經過Cursor 咱們能夠對從數據庫查詢出來的結果集進行隨  機的讀寫訪問。

OK,基本知識就介紹到這裏,下面開始上代碼:仍是按照個人一向風格,代碼中該解釋的地方都已經在代碼中及時註釋和講解了!

順便來張項目截圖:

先給出xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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 練習!(若是你使用的SD卡存儲數據方式,爲了保證正常操做,請你先點擊建立一張表而後再操做)"
         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= "查詢數據庫" ></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= "刪除數據表單" ></Button>
     <Button android:id= "@+id/sql_newTable" android:layout_width= "fill_parent"
         android:layout_height= "wrap_content" android:text= "新建數據表單" ></Button>
</LinearLayout>

xml中定義了咱們須要練習用到的幾個操做按鈕,這裏很少解釋了,下面看java源碼:先看咱們繼承的 SQLiteOpenHelper 類

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.himi;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
  *
  * @author Himi
  * @解釋 此類咱們只須要傳建一個構造函數 以及重寫兩個方法就OK啦、
  *
  */
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
     public final static int VERSION = 1 ; // 版本號
     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 中建立和打開一個數據庫均可以使用openOrCreateDatabase 方法來實現,
         // 由於它會自動去檢測是否存在這個數據庫,若是存在則打開,不過不存在則建立一個數據庫;
         // 建立成功則返回一個 SQLiteDatabase對象,不然拋出異常FileNotFoundException。
         // 下面是來建立一個名爲"DATABASE_NAME"的數據庫,並返回一個SQLiteDatabase對象  
 
         super (context, DATABASE_NAME, null , VERSION);
     }
     @Override
     // 在數據庫第一次生成的時候會調用這個方法,通常咱們在這個方法裏邊生成數據庫表;
     public void onCreate(SQLiteDatabase db) {
         String str_sql = "CREATE TABLE " + TABLE_NAME + "(" + ID
                 + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );" ;
         // CREATE TABLE 建立一張表 而後後面是咱們的表名
         // 而後表的列,第一個是id 方便操做數據,int類型
         // PRIMARY KEY 是指主鍵 這是一個int型,用於惟一的標識一行;
         // AUTOINCREMENT 表示數據庫會爲每條記錄的key加一,確保記錄的惟一性;
         // 最後我加入一列文本 String類型
         // ----------注意:這裏str_sql是sql語句,相似dos命令,要注意空格!
         db.execSQL(str_sql);
         // execSQL()方法是執行一句sql語句
         // 雖然此句咱們生成了一張數據庫表和包含該表的sql.himi文件,
         // 可是要注意 不是方法是建立,是傳入的一句str_sql這句sql語句表示建立!!
     }
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         // 通常默認狀況下,當咱們插入 數據庫就當即更新
         // 當數據庫須要升級的時候,Android 系統會主動的調用這個方法。
         // 通常咱們在這個方法裏邊刪除數據表,並創建新的數據表,
         // 固然是否還須要作其餘的操做,徹底取決於遊戲需求。
         Log.v( "Himi" , "onUpgrade" );
     }
}

我喜歡代碼中當即附上解釋,感受這樣代碼比較讓你們更容易理解和尋找,固然若是童鞋們不喜歡,能夠告訴我,我改~嘿嘿~

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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 輕量級數據庫、
  * @優勢: 能夠將本身的數據存儲到文件系統或者數據庫當中, 也能夠將本身的數據存
  *         儲到SQLite數據庫當中,還能夠存到SD卡中
  * @注意1:數據庫對於一個遊戲(一個應用)來講是私有的,而且在一個遊戲當中,
  *         數據庫的名字也是惟一的。
  * @注意2 apk中建立的數據庫外部的進程是沒有權限去讀/寫的,
  *         咱們須要把數據庫文件建立到sdcard上能夠解決相似問題.
  * @注意3 當你刪除id靠前的數據或者所有刪除數據的時候,SQLite不會自動排序,
  *        也就是說再添加數據的時候你不指定id那麼SQLite默認仍是在原有id最後添加一條新數據
  * @注意4 android 中 的SQLite 語法大小寫不敏感,也就是說不區分大小寫;
  *
  */
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; // 建立一個繼承SQLiteOpenHelper類實例
     private SQLiteDatabase mysql ;
//---------------如下兩個成員變量是針對在SD卡中存儲數據庫文件使用
//  private File path = new File("/sdcard/himi");// 建立目錄
//  private File f = new File("/sdcard/himi/himi.db");// 建立文件
     @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 ); // 實例一個數據庫輔助器
//備註1  ----若是你使用的是將數據庫的文件建立在SD卡中,那麼建立數據庫mysql以下操做:
//      if (!path.exists()) {// 目錄存在返回false
//          path.mkdirs();// 建立一個目錄
//      }
//      if (!f.exists()) {// 文件存在返回false
//          try {
//              f.createNewFile();//建立文件
//          } catch (IOException e) {
//              // TODO Auto-generated catch block
//              e.printStackTrace();
//          }
//      }
     }
     @Override
     public void onClick(View v) {
         try {
//備註2----若是你使用的是將數據庫的文件建立在SD卡中,那麼建立數據庫mysql以下操做:
//              mysql = SQLiteDatabase.openOrCreateDatabase(f, null);
//備註3--- 若是想把數據庫文件默認放在系統中,那麼建立數據庫mysql以下操做:
                 mysql = myOpenHelper.getWritableDatabase(); // 實例數據庫
             if (v == btn_addOne) { // 添加數據
                 // ---------------------- 讀寫句柄來插入---------
                 // ContentValues 其實就是一個哈希表HashMap, key值是字段名稱,
                 //Value值是字段的值。而後 經過 ContentValues 的 put 方法就能夠
                 //把數據放到ContentValues中,而後插入到表中去!
                 ContentValues cv = new ContentValues();
                 cv.put(MySQLiteOpenHelper.TEXT, "測試新的數據" );
                 mysql.insert(MySQLiteOpenHelper.TABLE_NAME, null , cv);
                 // inser() 第一個參數 標識須要插入操做的表名
                 // 第二個參數 :默認傳null便可
                 // 第三個是插入的數據
                 // ---------------------- SQL語句插入--------------
                 // String INSERT_DATA =
                 // "INSERT INTO himi (id,text) values (1, '經過SQL語句插入')";
                 // db.execSQL(INSERT_DATA);
                 tv.setText( "添加數據成功!點擊查看數據庫查詢" );
             } else if (v == btn_deleteone) { // 刪除數據
                 // ---------------------- 讀寫句柄來刪除
                 mysql.delete( "himi" , MySQLiteOpenHelper.ID + "=1" , null );
                 // 第一個參數 須要操做的表名
                 // 第二個參數爲 id+操做的下標 若是這裏咱們傳入null,表示所有刪除
相關文章
相關標籤/搜索