若要Build附有SQLite的專案,則必須使用Pro版本
或者是先編出沒有dll的apk → 將副檔名從apk改成zip並解壓縮 → 將dll檔放入專門存放dll的資料夾內 → 將整個解壓縮的檔案重新使用「僅儲存」壓縮回去並將副檔名從zip改成apk → 上網找apk簽名的程式將檔案重新簽名 → 完成。
2016/03/04版本更新內容如下:
1.openDatabase改名為openDatabaseConnecting
2.增加插入大量資料的Method,使用方式為依序呼叫insertBigDataInitialize、insertBigDataInto、insertBigDataWrite
insertBigDataInitialize:初始化大量資料寫入功能
insertBigDataInto:準備將資料按順序寫入資料表內,一次限寫一row的資料。(可重複呼叫多次)
insertBigDataWrite:將insertBigDataInto儲存的大量資料一次性的寫入資料庫內。(呼叫過這個Method後,若要再插入新的大量資料,請從insertBigDataInitialize重新開始)
2016/03/02版本更新內容如下:
1.修正資料讀取的效率
2.增加模糊搜索Method
Android和Windows平台其實大同小異,差在資料庫儲存的方式不同而已
(版本請看至頂文)
SQLite的資料儲存型態如下幾點:
- NULL:空值。
- INTEGER:帶符號的整數型態,具體取決有存入數字的範圍大小。
- REAL:浮點數,儲存8-byte IEEE浮點數。
- TEXT:字串型態。
- BLOB:二進制型態。
但實際上,sqlite3也接受如下的數據類型:
- smallint:16 位元的整數。
- interger:32 位元的整數。
- decimal(p,s):p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位數。如果沒有特別指定,則系統會設爲 p=5; s=0 。
- float:32位元的浮點數。
- double:64位元的浮點數。
- char(n):n 長度的字串,n不能超過 254。
- varchar(n):長度不固定且其最大長度爲 n 的字串,n不能超過 4000。
- graphic(n):和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是爲了支援兩個字元長度的字體,例如中文字。
- vargraphic(n):可變長度且其最大長度爲 n 的雙字元字串,n不能超過 2000。
- date:包含了 年份、月份、日期。
- time:包含了 小時、分鐘、秒。
- timestamp:包含了 年、月、日、時、分、秒、千分之一秒。
先創建一個新的Project,我將其命名為test
場景只留下Main Camera,將紅框這邊的顏色改為黑色(只是為了方便顯示結果)
然後請下載以下這些檔案(SQLite3已包好)
1.SQLite3 Database for Android.unitypackage
Database.cs內的資料庫處理程式碼則是修改雨松大大的這篇文章
下載後引入SQLite3 Database for Android.unitypackage,再將Database.cs放到專案內(test則是我另外存的場景,SQLite3 Database for Android.unitypackage內不會有這個檔案)
先創造一個C# scripts,我將其命名為Test,然後編寫以下程式
using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite;
public class Test : MonoBehaviour
{
Database db;//資料庫物件
string databaseName = "Yang.db";//資料庫名稱
string tableName = "Yu";//資料庫內的資料表名稱
SqliteDataReader reader;//搜尋資料表的資料
string show = "";//要顯示在螢幕上的內容
/* Unity預設的函數執行順序為:Awake -> OnEablen -> Start -> FixedUpdate -> Update -> LateUpdate -> OnGUI -> (結束時繼續往下走,否則回到FixedUpdate) -> OnDisable -> OnDestroy */
void Start ()
{
db = new Database(databaseName);//建立資料庫,同時進行連線,也可改寫成下面被註解的那兩行。由於不同平台所使用的連線語法都不一樣,所以我已經先預設好了,若要修改或得知Windows路徑則到Database.cs內搜尋「Windows端的資料庫存放位置」;Android則因為諸多限制,所以不建議修改。
/*
db = new Database();
db.databaseConnection(databaseName);
*/
db.openDatabaseConnecting();//開啟資料庫
if (db.isTableExists(tableName) == false)//確認是否已有指定的資料表,若沒有則創造該資料表同時插入資料
{
db.createTable(tableName, new string[] { "Name", "Age" }, new string[] { "TEXT", "INTEGER" });//TEXT為SQLite的字串型態,INTEGER為SQLite的整數型態
db.insertInto(tableName, new string[] { "'Yang'", "21" });//資料庫的字串資料必須使用單引號框起來'Yang'
db.insertInto(tableName, new string[] { "'Qing'", "22" });
}
}
void OnGUI()
{
GUI.Label(new Rect(250, 0, 500, 500), show);
if (GUI.Button(new Rect(0, 0, 200, 100), "搜尋Name資料並顯示"))
{
//搜尋和讀取符合的資料
reader = db.searchAccordData(tableName, "Name", "=", "'Yang'");
string[] data = db.readStringData(reader, "Name");
//將讀取到的第一筆資料顯示出來
show = data[0].ToString();
}
if (GUI.Button(new Rect(0, 150, 200, 100), "搜尋Age資料並顯示"))
{
//搜尋和讀取符合的資料
reader = db.searchAccordData(tableName, "Age", ">", "21");
int[] data = db.readIntData(reader, "Age");
//將讀取到的第一筆資料顯示出來
show = data[0].ToString();
}
}
void OnDisable()
{
db.closeDatabaseConnecting();//當該程式碼所放置的物件被銷毀時關閉資料庫連線
}
void OnDestroy()
{
//釋放資料庫
db.releaseDatabaseAllResources();
}
}
然後只要將Test.cs拖到Main Camera身上即可(Database.cs不需要拖到任何物件身上)
按下執行即可成功創建資料庫,且插入、讀取內部資料。
以下是執行結果:
(在Unity上)
(在Windows上,到 Player Settings → Other Settings 將紅框處改為和我一樣)
(在Android手機上,和Windows上一樣選擇.NET 2.0,PlayerSettings.bundleIdentifier則是隨意輸入,其他建議和我一樣)
Database.cs內的方法(Method)已有用中文解釋,若不清楚可以使用這個軟體讀取資料庫後查看程式碼到底做了哪些事。
留言列表