共用方式為


在 iOS 應用程式中使用數據

DataAccess_Adv範例顯示可讓使用者輸入和 CRUD (建立、讀取、更新和刪除) 資料庫功能的工作應用程式。 應用程式包含兩個畫面:清單和數據輸入表單。 在 iOS 和 Android 中,所有資料存取代碼都可以重複使用,而不需要修改。

在新增一些數據之後,應用程式畫面在iOS上看起來會像這樣:

iOS sample list

iOS sample detail

iOS 專案如下所示 – 本節中顯示的程式代碼包含在 Orm 目錄中:

iOS project tree

iOS 中 ViewControllers 的原生 UI 程式代碼範圍不足。 如需UI控件的詳細資訊,請參閱iOS使用數據表和儲存格指南。

參閱

範例中有數個讀取作業:

  • 讀取清單
  • 讀取個別記錄

類別中的 StockDatabase 兩個方法是:

public IEnumerable<Stock> GetStocks ()
{
    lock (locker) {
        return (from i in Table<Stock> () select i).ToList ();
    }
}
public Stock GetStock (int id)
{
    lock (locker) {
        return Table<Stock>().FirstOrDefault(x => x.Id == id);
    }
}

iOS 會將資料以不同的方式呈現為 UITableView

建立和更新

為了簡化應用程式程式代碼,會根據 PrimaryKey 是否已設定,提供執行 Insert 或 Update 的單一儲存方法。 因為屬性 Id 是以屬性標示 [PrimaryKey] ,所以您不應該在程式代碼中設定它。 這個方法會偵測是否已儲存值(藉由檢查主鍵屬性)並據以插入或更新物件:

public int SaveStock (Stock item)
{
    lock (locker) {
        if (item.Id != 0) {
            Update (item);
            return item.Id;
    } else {
            return Insert (item);
        }
    }
}

真實世界應用程式通常需要一些驗證(例如必要的欄位、最小長度或其他商務規則)。 良好的跨平臺應用程式在共用程式碼中盡可能實作驗證邏輯,根據平臺的功能,將驗證錯誤傳回UI以顯示。

刪除

Insert與和 Update 方法不同,Delete<T>方法只能接受主鍵值,而不是完整Stock物件。 在此範例中, Stock 對象會傳遞至 方法,但只會將Id屬性傳遞至 Delete<T> 方法。

public int DeleteStock(Stock stock)
{
    lock (locker) {
        return Delete<Stock> (stock.Id);
    }
}

使用預先填入的 SQLite 資料庫檔案

某些應用程式隨附的資料庫已填入數據。 您可以輕鬆地在行動應用程式中完成此作業,方法是將現有的SQLite 資料庫檔案與您的應用程式一起傳送,並將它複製到可寫入的目錄,再加以存取。 由於 SQLite 是許多平臺上所使用的標準檔案格式,因此有許多工具可用來建立 SQLite 資料庫檔案:

  • SQLite Manager Firefox 擴充功能 – 適用於 Mac 和 Windows,併產生與 iOS 和 Android 相容的檔案。
  • 命令列 – 請參閱 www.sqlite.org/sqlite.html

建立資料庫檔案以與您的應用程式一起散發時,請小心命名數據表和數據行,以確保它們符合您的程式代碼預期,特別是如果您使用 SQLite.NET 預期名稱符合 C# 類別和屬性(或相關聯的自定義屬性)。

若為 iOS,請在應用程式中包含 sqlite 檔案,並確定它已標示為 建置動作:內容。 將程式代碼放在 中 FinishedLaunching ,將檔案複製到可寫入的目錄 ,再 呼叫任何數據方法。 下列程式代碼只會複製名為 data.sqlite 的現有資料庫,但前提是它尚未存在。

// Copy the database across (if it doesn't exist)
var appdir = NSBundle.MainBundle.ResourcePath;
var seedFile = Path.Combine (appdir, "data.sqlite");
if (!File.Exists (Database.DatabaseFilePath))
{
  File.Copy (seedFile, Database.DatabaseFilePath);
}

在完成之後執行的任何數據存取碼(無論是 ADO.NET 或使用 SQLite.NET),都將能夠存取預先填入的數據。