日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

xamarin和mysql_Xamarin.Android 使用 SQLiteOpenHelper 进行数据库操作

發(fā)布時間:2024/9/27 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xamarin和mysql_Xamarin.Android 使用 SQLiteOpenHelper 进行数据库操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

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

二、數(shù)據(jù)庫

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

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 }

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

1 class LocationSqliteOpenHelper : SQLiteOpenHelper

2 {

3 public LocationSqliteOpenHelper(Context context)

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

5 {

6 }

7 }

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

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 }

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

TestSQLiteOpenHelper dbHelper = new TestSQLiteOpenHelper(this);

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

SQLiteDatabase db = dbHelper.WritableDatabase;

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

1.添加(Insert)

首先是該方法的定義:

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

其中參數(shù)的含義如下:

table:需要插入的表名。

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

values:需要插入的數(shù)據(jù)。

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

1 ContentValues cv = new ContentValues();

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

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

關(guān)鍵就是Put方法,它擁有以下的重載方法。

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);

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

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);

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

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

返回值則為所插入數(shù)據(jù)的主鍵。

2.查詢(Query)

首先是該方法的定義:

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);

其中參數(shù)的含義如下:

table:需要查詢的表名

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

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

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

groupBy:分組語句

having:分組條件

orderBy:排序語句

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

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

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

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

1 ic.MoveToFirst();

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

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

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

下面是關(guān)于ICursor方法的介紹

Count:獲取多少條數(shù)據(jù)

IsAfterLast:當(dāng)前是否在最后一條數(shù)據(jù)之后

IsBeforeFirst:當(dāng)前是否在第一條數(shù)據(jù)之前

IsClosed:是否已關(guān)閉

IsFirst:是否是第一條數(shù)據(jù)

IsLast:是否是最后一條數(shù)據(jù)

Position:當(dāng)前位置

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

GetColumnName:根據(jù)位置獲取字段名

MoveToFirst:移動到第一條數(shù)據(jù)

MoveToFirst:移動到最后一條數(shù)據(jù)

MoveToNext:移動到下一條數(shù)據(jù)

MoveToPosition:移動指定的位置

MoveToPrevious:移動到上一條數(shù)據(jù)

以下是根據(jù)位置獲取對應(yīng)類型的數(shù)據(jù)

GetDouble,GetFloat,GetInt,GetLong,GetShort,GetString

3.更新(Update)

首先是該方法的定義:

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

其中參數(shù)的含義如下

table:需要更新的數(shù)據(jù)所在的表

values:更新后字段的值

whereClause:查詢語句

whereArgs:查詢語句中需要的參數(shù)

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

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() });

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

4.刪除(Delete)

首先是該方法的定義:

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

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

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

TestSQLiteOpenHelper.cs

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 }

MainActivity的OnCreate中

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"));

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的xamarin和mysql_Xamarin.Android 使用 SQLiteOpenHelper 进行数据库操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。