上一篇跟各位童鞋介紹了SharedPreference 和 File流如何存儲數據,而且推薦使用FileOutputStream/FileInputStream來存儲我們遊戲數據,那麼這一篇則是像你們介紹另一種適合遊戲數據存儲的方式:SQLite 輕量級數據庫!java
先介紹幾個基本概念知識:mysql
什麼是SQLite:android
SQLite是一款輕量級數據庫,它的設計目的是嵌入式,並且它佔用的資源很是少,在嵌入式設備中,只須要幾百KB!!!!!sql
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,表示所有刪除
|