xamarin和mysql_Xamarin.Android 使用 SQLiteOpenHelper 進行數據庫操作

一、前言

在手機中進行網絡連接不僅是耗時也是耗電的,而耗電卻是致命的。所以我們就需要數據庫幫助我們存儲離線數據,以便在用戶未使用網絡的情況下也可以能夠使用應用的部分功能,而在需要網絡連接的功能上采用提示方式,讓用戶決定是否打開網絡。而本節我們將會學習如何訪問數據庫以及提供基本的增刪改查功能,并且使他們盡量的解耦。

二、數據庫

Xamarin.Android下創建本地數據庫與在Java下的方式相同,而我們必須掌握使用SQLiteOpenHelper,因為這個類會簡化我們創建數據的步驟,讓我們只需要關注創建數據庫中的表,并在數據庫版本需要更新時進行操作。其中我們必須實現OnCreate方法和OnUpgrade方法,OnCreate方法僅會在數據庫不存在的情況下才執行,所以不會重復執行。比如下面的代碼。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 class LocationSqliteOpenHelper : SQLiteOpenHelper

2 {

3 public override void OnCreate(SQLiteDatabase db)

4 {

5 }

6

7 public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

8 {

9 }

10 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

但是我們還需要使用父類的構造函數,指定數據庫的名稱以及初始版本。比如下面的代碼我們將創建一個名為“test”的數據,并且初始版本為1.。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 class LocationSqliteOpenHelper : SQLiteOpenHelper

2 {

3 public LocationSqliteOpenHelper(Context context)

4 : base(context, “test”, null,1)

5 {

6 }

7 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

學會了上面的操作,下面我們就可以創建一個名為Test的數據庫,并且該數據庫中含有一個USER表(SQLite數據庫下的主鍵需要為INTEGER類型,并且是自增的)。

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 public class TestSQLiteOpenHelper : SQLiteOpenHelper

2 {

3 public TestSQLiteOpenHelper(Context context)

4 : base(context, "Test", null, 1)

5 {

6 }

7

8 public override void OnCreate(SQLiteDatabase db)

9 {

10 db.ExecSQL("CREATE TABLE USER(id INTEGER PRIMARY KEY NOT NULL,uname TEXT NOT NULL,upwd TEXT NOT NULL)");

11 }

12

13 public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

14 {

15 db.ExecSQL("DROP TABLE IF EXISTS USER");

16 OnCreate(db);

17 }

18 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

創建了數據庫對象,下面我們就可以利用這個對象對數據庫進行操作了,首先我們需要在MainActivity中的OnCreate方法中初始化該數據庫對象。

TestSQLiteOpenHelper dbHelper = new TestSQLiteOpenHelper(this);

但是我們還不能直接使用dbHelper訪問數據庫,必須通過它的WritableDatabase屬性或ReadableDatabase屬性獲取對應權限的數據庫訪問對象,WritableDataBase可以對數據庫進行全部操作,ReadableDatabase可以對數據庫進行讀取操作。他們的返回類型都是SQLiteDataBase。所以我們還要根據需要獲取他們的對象。

SQLiteDatabase db = dbHelper.WritableDatabase;

這樣我們就可以通過db的Insert、Update、Query和Delete進行操作了,當然也可以使用ExecSQL直接執行我們SQL語句。下面我們將逐一介紹這些方法的使用。

1.添加(Insert)

首先是該方法的定義:

public virtual long Insert(string table, string nullColumnHack, ContentValues values);

其中參數的含義如下:

table:需要插入的表名。

nullColumnHack:當values為空或里面的值都為空時,數據庫是不允許插入一個空行的,如果需要插入空行,則需要指定一個字段名稱,這樣當發生如上情況后將會將該字段設為NULL然后在嘗試插入。

values:需要插入的數據。

關于前兩個參數很簡單不用過多介紹,如要介紹的是最后一個參數,它是一個ContentValues類型,通過它我們可以大大的簡化自己拼接插入語句的繁瑣,比如下面我們可以設置uname字段的值為yzf,upwd的值為123。

1 ContentValues cv = new ContentValues();

2 cv.Put("uname","yzf");

3 cv.Put("upwd","123");

關鍵就是Put方法,它擁有以下的重載方法。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 public void Put(string key, bool value);

2 public void Put(string key, byte[] value);

3 public void Put(string key, double value);

4 public void Put(string key, float value);

5 public void Put(string key, int value);

6 public void Put(string key, long value);

7 public void Put(string key, sbyte value);

8 public void Put(string key, short value);

9 public void Put(string key, string value);

48304ba5e6f9fe08f3fa1abda7d326ab.png

通過這些重載方法我們就可以插入不同類型的參數了,當然我們也可以通過Remove方法刪除,如果我們需要為某個字段插入NULL值可以使用PutNull方法,判斷某個字段是否存在可以用ContainsKey方法,最后就是對應的獲取不同字段的值。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 public Object Get(string key);

2 public bool GetAsBoolean(string key);

3 public sbyte GetAsByte(string key);

4 public byte[] GetAsByteArray(string key);

5 public double GetAsDouble(string key);

6 public float GetAsFloat(string key);

7 public int GetAsInteger(string key);

8 public long GetAsLong(string key);

9 public short GetAsShort(string key);

10 public string GetAsString(string key);

48304ba5e6f9fe08f3fa1abda7d326ab.png

簡單的介紹完ContentValues的使用,下面我們將使用它來添加一條數據,比如下面的代碼將添加一條數據到User表中。

long id = db.Insert("User", null, cv);

返回值則為所插入數據的主鍵。

2.查詢(Query)

首先是該方法的定義:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 public virtual ICursor Query(string table, string[] columns, string selection, string[] selectionArgs, string groupBy, string having, string orderBy);

2 public virtual ICursor Query(string table, string[] columns, string selection, string[] selectionArgs, string groupBy, string having, string orderBy, string limit);

3 public virtual ICursor Query(bool distinct, string table, string[] columns, string selection, string[] selectionArgs, string groupBy, string having, string orderBy, string limit);

48304ba5e6f9fe08f3fa1abda7d326ab.png

其中參數的含義如下:

table:需要查詢的表名

columns:需要獲取的字段,如果傳入null則表示獲取所有字段

selection:條件語句,其中我們可以實用”?”作為參數的占位符(不同于SQL SERVER中的@)

selectionArgs:條件參數,用于替換查詢語句中的”?”

groupBy:分組語句

having:分組條件

orderBy:排序語句

limit:分頁語句(如”1,3”表示獲取第1到第3的數據共3條)

之前通過Insert插入的數據,此時我們可以通過Query方法從數據庫中獲取,比如下面的代碼

ICursor ic = db.Query("User", new string[] { "id", "uname", "upwd" }, " id = ? ", new string[] { id.ToString() }, null, null, null);

該方法最后會返回一個實現了ICursor接口的對象,利用這個接口我們就可以從中獲取數據了,下面我們獲取其中的用戶名和密碼

1 ic.MoveToFirst();

2 string uname = ic.GetString(ic.GetColumnIndex("uname"));

3 string upwd = ic.GetString(ic.GetColumnIndex("upwd"));

因為ICursor是針對一個結果集的,所以我們需要先定位到第一條數據,所以采用MoveToFirst方法,然后通過GetString獲取參數,但是還需要傳遞一個字段的位置,所以我們還需要使用GetColumnIndex獲取指定字段名稱的位置。

下面是關于ICursor方法的介紹

Count:獲取多少條數據

IsAfterLast:當前是否在最后一條數據之后

IsBeforeFirst:當前是否在第一條數據之前

IsClosed:是否已關閉

IsFirst:是否是第一條數據

IsLast:是否是最后一條數據

Position:當前位置

GetColumnIndex:根據字段名獲取位置,如果不存在該字段則返回-1

GetColumnName:根據位置獲取字段名

MoveToFirst:移動到第一條數據

MoveToFirst:移動到最后一條數據

MoveToNext:移動到下一條數據

MoveToPosition:移動指定的位置

MoveToPrevious:移動到上一條數據

以下是根據位置獲取對應類型的數據

GetDouble,GetFloat,GetInt,GetLong,GetShort,GetString

3.更新(Update)

首先是該方法的定義:

Update(string table, ContentValues values, string whereClause, string[] whereArgs);

其中參數的含義如下

table:需要更新的數據所在的表

values:更新后字段的值

whereClause:查詢語句

whereArgs:查詢語句中需要的參數

有了插入、查詢數據的幫助下,我們可以在插入數據之后更新這條數據,然后再通過Query獲取該數據,查看數據的是否變動。

1 ContentValues ncv = new ContentValues();

2 ncv.Put("uname", "zn");

3 ncv.Put("upwd", "456");

4 db.Update("User", ncv, " id = ? ", new string[] { id.ToString() });

這里的條件語句跟查詢中的語句是類似的,然后我們查看獲取的數據可以發覺的確發生了修改。

4.刪除(Delete)

首先是該方法的定義:

public virtual int Delete(string table, string whereClause, string[] whereArgs);

關于參數的說明跟Update是相同的,所以實用方式這里就不做介紹了。

全部實例的全部代碼如下所示:

TestSQLiteOpenHelper.cs

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 public class TestSQLiteOpenHelper : SQLiteOpenHelper

2 {

3 public TestSQLiteOpenHelper(Context context)

4 : base(context, "Test", null, 1)

5 {

6 }

7

8 public override void OnCreate(SQLiteDatabase db)

9 {

10 db.ExecSQL("CREATE TABLE USER(id INTEGER PRIMARY KEY NOT NULL,uname TEXT NOT NULL,upwd TEXT NOT NULL)");

11 }

12

13 public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

14 {

15 db.ExecSQL("DROP TABLE IF EXISTS USER");

16 OnCreate(db);

17 }

18 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

MainActivity的OnCreate中

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 TestSQLiteOpenHelper dbHelper = new TestSQLiteOpenHelper(this);

2 SQLiteDatabase db = dbHelper.WritableDatabase;

3

4 ContentValues cv = new ContentValues();

5 cv.Put("uname","yzf");

6 cv.Put("upwd","123");

7 long id = db.Insert("User", null, cv);

8

9 ContentValues ncv = new ContentValues();

10 ncv.Put("uname", "zn");

11 ncv.Put("upwd", "456");

12 db.Update("User", ncv, " id = ? ", new string[] { id.ToString() });

13

14 ICursor ic = db.Query("User", new string[] { "id", "uname", "upwd" }, " id = ? ", new string[] { id.ToString() }, null, null, null);

15 ic.MoveToFirst();

16 string uname = ic.GetString(ic.GetColumnIndex("uname"));

17 string upwd = ic.GetString(ic.GetColumnIndex("upwd"));

48304ba5e6f9fe08f3fa1abda7d326ab.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529225.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 絕對值誤差小于10-6_Python 被低估了的 10 個小技巧

hi,各位朋友們,小帥b回來啦,幾日不見,想我了么?今天給大家分享幾個我認為不錯的 Python 小技巧,有些可能被你低估了喲,get 起來!那么接下來就是:學習 Python 的正確姿勢俗…

java bean驗證_javaBean--登錄驗證

packagecom.JAVABean;importjava.util.HashMap;importjava.util.Map;publiccla***egister{privateStringname;privateStringage;privateStringemail;privateMaperrorsnull;//聲明一個保存全部錯誤信息的map集合publicRegister(){//在構造方法中初始化屬性this.name""…

java讀取src xml文件路徑_Java獲取路徑方法相對路徑讀取xml文件方法

(1)、request.getRealPath("/");//不推薦使用獲取工程的根路徑(2)、request.getRealPath(request.getRequestURI());//獲取jsp的路徑,這個方法比較好用,可以直接在servlet和jsp中使用(3)、request.getSession().getServletContext().getRealPa…

釋放tcp連接的命令是_最實用的6個網絡命令,網絡故障不求人

很多弱電工程師朋友在項目中經常遇到一些網絡故障,需要通過一些一些命令去檢測、定位故障點,通過使用網絡命令,故障解決的工作取得了事半功倍的效果。下面就一起溫故而知新吧!一、ping命令(因特網包探索器)…

airpods2怎么查正品 ios11系統_拼多多AirPods2開箱評測,4種辦法教你驗真假,10個AirPods技巧教你玩...

大家好,Apple今天給大家分享一下拼多多上車AirPods 2無線充電盒版的經驗,順便整理了一波AirPods使用技巧,希望你用得上。入手理由自從去年10月份入手了iPhone XR,其實就挺想入款無線耳機的,所以一直在等AirPods升級換代…

java中for break的用法_java break語句的使用方法

在switch語中,break語句用來終止switch語句的執行。使程序 switch語句后的第一個語句 開始執行。在Java中,可以為每個代碼塊加一個括號,一個代碼塊通常 用大括號{}括起來的一段 代碼。加標號的格式break語句有兩種形式:無標簽和有標簽。無標簽的break語句用來跳出單…

windows文件保護_Windows系統下媲美時間機器的系統備份工具,統統免費

Windows和macOS系統誰更美?不同的人有不同的見解。但體驗過macOS之后很多電腦玩家會感嘆,TimeMachine時間機器太好用了,Windows下有沒有同類功能呢?TimeMachine提供了全盤完整備份、增量備份、文件歷史版本等功能。它們在Windows …

JAVA結課_一點心情,寫java結課考試之前

突然發現,已經好久沒有上來寫blog了,本來還以為能夠天天寫,后來發現,確是心有余力而不足啊。學期進入中段,課業慢慢多了,各種各樣的事情也接踵而來了。本學期的java課程也已經結課了,8周32個學時…

sql怎么撤回update_騰訊SQL“現役運動員”給你的實踐小技巧

引言SQL的全稱是Structured Query Language(結構化查詢語言),是一種古老而簡潔的程序設計語言。看似平平無奇,一直被各種吐槽,但卻有著眾多語言所難得的漫長壽命,并展現出極好的拓展性,在不同時期衍生出不同的子語言。…

mysql 同一帳號多次登錄_freeradius2.1.3 防止用戶帳號重復登錄

freeradius2.1.3 防止用戶帳號重復登錄一、修改 etc/raddb/sites-enabled 目錄中的default 及inner-tunnel 這兩個文件中的# Session database, used for checking Simultaneous-Use. Either the radutmp# or rlm_sql module can handle this.# The rlm_sql module is *much…

小程序input wxss_19. 教你零基礎搭建小程序:wxss-尺寸單位

這章以后的四章都是介紹小程序樣式文件——wxss 的使用,分為以下三個部分一、尺寸方案二、樣式導入三、選擇器這章先來講wxss的尺寸單位—— rpxwxss的定義:WXSS( WeiXin Style Sheets )是?套樣式語言,用于描述 WXML 的組件樣式。與 CSS 相比…

java 最優算法_java 問題 求個最優算法

不知道是不是你要的package test;import java.util.Scanner;public class Number {/*** param args*/public static void main(String[] args) {int count 15;int val 5;Scanner input new Scanner(System.in);System.out.print("請輸入開始數:");int …

某一個接口403 其他接口可以調通_Neo的務實外設指南 篇三十六:一個就夠,65W快充+C口混插+最多6個設備 - 飛利浦65W摩天輪插座_插座...

2020-10-26 15:29:0623點贊23收藏2評論嗨,大家好!我是沈少!之前曬雷電3擴展塢的時候,已經有小伙伴注意到我用來提供PD充電的是一個很小巧的魔方插座。也有朋友私下提醒我,這類產品雖然支持PD快充協議,但一般…

linux java 獲取路徑怎么寫_linux中java獲取路徑怎么寫?

linux中java獲取路徑怎么寫?在Unix/Linux中,路徑的分隔采用正斜"/",比如"cd /home/java"。在java的代碼開發中 是代表轉義字符。相對路徑和絕對路徑. 指的是當前目錄.. 指的是當前目錄的上一級目錄./book表示當前目錄下的…

layerconfirm 自動關閉問題 沒有阻塞問題_微信新版本自動更新?趕緊關閉這個功能...

前不久安卓用戶也迎來了微信新版本的更新不少伙伴驚呼“猝不及防,一覺醒來發現微信自動更新了”一時間還沖上了話題的熱搜榜究竟是怎么肥事?小移了解到:原來是因為部分用戶設置了“微信自動更新”那么問題來了,如何關閉微信自動更…

java 動態生成getset_通過get、set方法,動態生成對象

最近在看Java的反射,把學習的東西整理一下,大家共同研究,有需要改進的地方,請大家指正。import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class ReflectionTest {p…

list steam_在 Steam 中國版上玩單機游戲也會受到防沉迷系統管控

今天看到一個消息,Steam 中國版,也就是所謂的“蒸汽平臺”,最近正在測試。重點在于,哪怕你玩“理論上無需聯網”的單機游戲,游玩時間也會受到著名的防沉迷系統的限制。以下是我在動點科技編寫的新聞全文(原文鏈接是界面…

java的默認訪問權限_java類的訪問權限

1.解析Java有四種訪問權限, 其中三種有訪問權限修飾符,分別為private,public和protected,還有一種不帶任何修飾符。private: Java語言中對訪問權限限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的類、屬性以及方…

github流程圖_逆天插件,VSCode里也能畫流程圖了?Visio可以淘汰了?

vscode-drawio簡介網絡之大,人才百出,在開源背景下,一些功能只有你想不到,沒有做不到。這不,對于寫代碼的程序員來說,竟然也可以在VSCode IDE里邊寫代碼,邊畫邏輯流程圖了。最近,在g…

CentOS+ISCSI

九、配置iSCSI 添加1塊大小為10G的虛擬硬盤; 安裝iSCSI服務端targetcli; 使用新增加的硬盤創建卷組,名稱為iscsivg,再創建iSCSI共享邏輯卷,邏輯 卷名稱為iscsistore,大小為5G; 使用上述邏輯卷創建后端存儲,名稱為serverc.iscsistore; 定義iSCSI的IQN為iqn.2022-…