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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLlite在安卓中的基本详解和简单使用

發布時間:2023/12/18 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLlite在安卓中的基本详解和简单使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基礎介紹

1.SQLite 是一個進程內的庫,是一種輕量級的、自給自足的、無服務器的、無需配置的,事務性的SQL數據庫引擎.和他其他的數據庫一樣,SQLite引擎不是一個獨立的進程,可以按應用程序需求進行靜態或動態連接。SQLite可以直接訪問其存儲文件。

SQLite是一個開源的嵌入式關系數據庫,它在2000年由D. Richard Hipp發布,用C語言編寫的開源嵌入式數據庫引擎,它的減少應用程序管理數據的開銷,SQLite可移植性好,很容易使用,很小,高效而且可靠。它支持大多數的SQL92標準,并且可以在所有主要的操作系統上運行。

SQLite嵌入到使用它的應用程序中,它們共用相同的進程空間,而不是單獨的一個進程。從外部看,它并不像一個RDBMS,但在進程內部,它卻是完整的,自包含的數據庫引擎。嵌入式數據庫的一大好處就是在你的程序內部不需要網絡配置,也不需要管理。因為客戶端和服務器在同一進程空間運行。

SQLite 的數據庫權限只依賴于文件系統,沒有用戶帳戶的概念。SQLite 有數據庫級鎖定,沒有網絡服務器。它需要的內存,其它開銷很小,適合用于嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。

2.SQLite 是一個開源的嵌入式關系數據庫。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。 與其他數據庫管理系統不同,SQLite 的安裝和運行非常簡單,在大多數情況下 - 只要確保SQLite的二進制文件存在即可開始創建、連接和使用數據庫。如果您正在尋找一個嵌入式數據庫項目或解決方案,SQLite是絕對值得考慮。

3、SQLite的特點(SQLite’s Features and Philosophy)?
3.1、零配置(Zero Configuration)?
3.2、可移植(Portability):?
它是運行在Windows,Linux,BSD,Mac OS X和一些商用Unix系統,比如Sun的Solaris,IBM的AIX,同樣,它也可以工作在許多嵌入式操作系統下,比如QNX,VxWorks,Palm OS, Symbin和Windows CE。?
3.3、Compactness:?
SQLite是被設計成輕量級,自包含的。one header file, one library, and you’re relational, no external database server required?
3.4、簡單(Simplicity)、靈活(Flexibility)、可靠(Reliability):?
SQLite的核心大約有3萬行標準C代碼,這些代碼都是模塊化的,很容易閱讀。?
SQLite由以下幾個部分組成:SQL編譯器、內核、后端以及附件。SQLite通過利用虛擬機和虛擬數據庫引擎(VDBE),是調試、修改和擴展SQLite的內核變得更加方便。所有SQL語句都被編譯成易讀的、可以在SQLite虛擬機中執行的程序集。SQLite的整體結構圖如下:?
? ? ? ? ? ? ? ?

值得一提的是,袖珍型的SQLite竟然可以支持高達2TB大小的數據庫,每個數據庫都是以單個文件的形式存在,這些數據都是以B-Tree的數據結構形式存儲在磁盤上。?
在事務處理方面,SQLite通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程想數據庫執行寫操作之前,必須獲得獨占鎖。在獲得獨占鎖之后,其他的讀或寫操作將不會再發生。

4.數據類型?
SQLite為弱類型數據。?
SQLite采用動態數據類型,當某個值插入到數據庫時,SQLite將會檢查它的類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作為本身的類型存儲,SQLite稱這為“弱類型”。但有一個特例,如果是INTEGER PRIMARY KEY,則其他類型不會被轉換,會報一個“datatype missmatch”的錯誤。因為定義為INTEGER PRIMARY KEY的字段只能存儲64位整數, 當向這種字段保存除整數以外的數據時,將會產生錯誤。 ?
概括來講,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數據類型,分別代表空值、整型值、浮點值、字符串文本、二進制對象。?
一般數據采用的固定的靜態數據類型,而SQLite采用的是動態數據類型,會根據存入值自動判斷。SQLite具有以下五種常用的數據類型:

NULL: 這個值為空值?
VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過 4000。?
CHAR(n):長度固定為n的字串,n不能超過 254。?
INTEGER: 值被標識為整數,依據值的大小可以依次被存儲為1,2,3,4,5,6,7,8.?
REAL: 所有值都是浮動的數值,被存儲為8字節的IEEE浮動標記序號.?
TEXT: 值為文本字符串,使用數據庫編碼存儲(TUTF-8, UTF-16BE or UTF-16-LE).?
BLOB: 值是BLOB數據塊,以輸入的數據格式進行存儲。如何輸入就如何存儲,不改 ?變格式。?
DATA :包含了 年份、月份、日期。?
TIME: 包含了 小時、分鐘、秒。

二、數據庫使用

SQLiteOpenHelper數據庫版本管理?
為了實現對數據庫版本進行管理,SQLiteOpenHelper類提供了兩個重要的方法,分別是

onCreate(SQLiteDatabase db)

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),123

前者用于初次使用軟件時生成數據庫表,后者用于升級軟件時更新數據庫表結構。

當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用于操作數據庫的SQLiteDatabase實例的時候,如果數據庫不存在,Android系統會自動生成一個數據庫,接著調用onCreate()方法,onCreate()方法在初次生成數據庫時才會被調用,在onCreate()方法里可以生成數據庫表結構及添加一些應用使用到的初始化數據。onUpgrade()方法在數據庫的版本發生變化時會被調用,一般在軟件升級時才需改變版本號,而數據庫的版本是由程序員控制的,假設數據庫現在的版本是1,由于業務的變更,修改了數據庫表結構,這時候就需要升級軟件,升級軟件時希望更新用戶手機里的數據庫表結構,為了實現這一目的,可以把原來的數據庫版本設置為2(有同學問設置為3行不行?當然可以,如果你愿意,設置為100也行),并且在?
onUpgrade()方法里面實現表結構的更新。當軟件的版本升級次數比較多,這時在onUpgrade()方法里面可以根據原版號和目標版本號進行判斷,然后作出相應的表結構及數據更新。?
? getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用于操作數據庫的SQLiteDatabase實例。但getWritableDatabase() 方法以讀寫方式打開數據庫,一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,倘若使用getWritableDatabase()打開數據庫就會出錯。?
getReadableDatabase()方法先以讀寫方式打開數據庫,如果數據庫的磁盤空間滿了,就會打開失敗,當打開失敗后會繼續嘗試以只讀方式打開數據庫。

?

public class DatabaseHelper extends SQLiteOpenHelper { ?

? ? ? ? //類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態 ?

? ? ? ? ?private static final String name = "count"; //數據庫名稱 ?

? ? ? ? ?private static final int version = 1; //數據庫版本 ?更新之后改變數據庫版本號
? ? ? ? ?public DatabaseHelper(Context context) { ?
? ? ? ? ? ? ? //第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類 ?
? ? ? ? ? ? ? ? super(context, name, null, version); ?
? ? ? ? ?} ? ?
? ? ? ? @Override ?
? ? ? ? public void onCreate(SQLiteDatabase db) { ?
? ? ? ? ? ? ? db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age?

INTEGER)"); ? ? ??
? ? ? ? ?} ??
? ? ? ? @Override ??
? ? ? ? public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { ?
? ? ? ? ? ? ? ? ?db.execSQL("ALTER TABLE person ADD phone VARCHAR(12)"); //往表中增加一列 ? ?
? ? ? ? ?} ?123456789101112131415161718192021

將會對比版本號,如果本身沒有數據庫,即數據庫版本號為0,也就是第一次安裝app,就會直接走onCreate方法,如果數據庫本身已經存在了,如果版本號大于改版本號,就會執行onUpgrade方法。數據庫版本只能升級,不能降級,降級會閃退。

三、基本語句:

openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory ?factory)?
打開或創建數據庫?
insert(String table,String nullColumnHack,ContentValues ?values)?
插入一條記錄?
delete(String table,String whereClause,String[] ?whereArgs)?
刪除一條記錄?
query(String table,String[] columns,String selection,String[] ?selectionArgs,String groupBy,String having,String ?orderBy)?
查詢一條記錄?
update(String table,ContentValues values,String whereClause,String[] ?whereArgs)?
修改記錄?
execSQL(String sql)?
執行一條SQL語句?
close()?
關閉數據庫

1、建表語句:

?

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20),age integer default(0); 1

主鍵自增,最高20位,default默認值。

2、插入

?

insert into person(name, age) values(‘小明’,3) ?1

3、刪除

?

delete from person ?where age=10;1

4、更新

?

update person set name=‘小明‘ where age=10 ?1

5、查詢

?

select * from person ? ? ? 查詢所有
select * from person order by id desc ? ?降序查詢,asc是升序

select name from person group by name having count(*)>1 ? ?分組查詢?

select * from Account limit 5 offset 3 ? ? ? ? 分頁查詢 ? ?123456

6、對表進行操作alert

?

增加一列: alert(into) person add address varchar(255);

刪除列: alert person drop column age;

重命名列: alert person change age age_number integer;

**四、實例用法:**

寫法,傳統的一般的sql語句和insert方法,除了用execSQL()之外,還有
insert()、delete()、update()和query() ?能完成數據的添加、刪除、更新、查詢操作。

1、插入
(1)
SQLiteDatabase db = ....; ??
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"炸死特", 4}); ? ??
db.close(); ?

execSQL(String sql, Object[] bindArgs)方法的第一個參數為SQL語句,第二個參數為SQL語句中占位符參數的值,參數值在數組中的順序要和占位符的位置對應。
用占位符可以省去轉義的痛苦。以免里面參數多次進行轉義。
(2)
Insert()方法用于添加數據,各個字段的數據使用ContentValues進行存放,ContentValues類似于map集合,它提供了存取數據對應的put(String key, Xxx value)和getAsXxx(String key)方法, ?key為字段名稱,value為字段值,Xxx指的是各種常用的數據類型,如:String、Integer等。

SQLiteDatabase db = databaseHelper.getWritableDatabase(); ? ?
ContentValues values = new ContentValues(); ? ?
values.put("name", "炸死特"); ? ?
values.put("age", 4); ? ?
long rowid = db.insert(“person”, null, values);//返回新添記錄的行號,與主鍵id無關 ?

2、查詢:1234567891011121314151617181920212223242526272829

(1)?
SQLiteDatabase db = ….;?
Cursor cursor = db.rawQuery(“select * from person where name like ? and age=?”, new String[]{“%炸死特%”, “4”});?
while (cursor.moveToNext()) {?
? int personid = cursor.getInt(0); //獲取第一列的值,第一列的索引從0開始?
? String name = cursor.getString(1);//獲取第二列的值?
? int age = cursor.getInt(2);//獲取第三列的值?
}?
cursor.close();?
db.close(); ?

?

Cursor是結果集游標,用于對結果集進行隨機訪問,如果大家熟悉jdbc, 其實Cursor與JDBC中的ResultSet作用很相似。使用moveToNext()方法可以將游標從當前行移動到下一行,如果已經移過了結果集的最后一行,返回結果為false,否則為true。另外Cursor 還有常用的moveToPrevious()方法(用于將游標從當前行移動到上一行,如果已經移過了結果集的第一行,返回值為false,否則為true )、moveToFirst()方法(用于將游標移動到結果集的第一行,如果結果集為空,返回值為false,否則為true )和moveToLast()方法(用于將游標移動到結果集的最后一行,如果結果集為空,返回值為false,否則為true ) 。

(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase(); ? ?
Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%炸死特%"}, null, null, "personid ?desc", "1,2"); ?

while (cursor.moveToNext()) { ?
? ? ? ? ?int personid = cursor.getInt(0); //獲取第一列的值,第一列的索引從0開始 ??
? ? ? ? ? String name = cursor.getString(1);//獲取第二列的值 ?
? ? ? ? ? int age = cursor.getInt(2);//獲取第三列的值 ??
} ??
cursor.close(); ?
db.close(); ? ? ??
query參數,
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各

**參數的含義:**
table:表名。相當于select語句from關鍵字后面的部分。如果是多表聯合查詢,可以用逗號將兩個表名分開。
columns:要查詢出來的列名。相當于select語句select關鍵字后面的部分。
selection:查詢條件子句,相當于select語句where關鍵字后面的部分,在條件子句允許使用占位符“?”
selectionArgs:對應于selection語句中占位符的值,值在數組中的位置與占位符在語句中的位置必須一致,否則就會有異常。
groupBy:相當于select語句group by關鍵字后面的部分
having:相當于select語句having關鍵字后面的部分
orderBy:相當于select語句order by關鍵字后面的部分,如:personid desc, age asc;
limit:指定偏移量和獲取的記錄數,相當于select語句limit關鍵字后面的部分。
3.刪除
(1)DELETE FROM table_name
或者:
DELETE * FROM table_name
? ? ?當然要加上條件判斷,
? ?SQLiteDatabase db = databaseHelper.getWritableDatabase(); ?
? db.execSQL("delete from ?table person where age >2 "); ?
? db.close(); ?
(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase(); ?
db.delete("person", "personid<?", new String[]{"2"}); ?
db.close(); ?

上面代碼用于從person表中刪除personid小于2的記錄。
第一個是表名,第二個參數是條件,相當于where personid< ? ?,?是占位符,內容是第三個參數。
5.update()方法
(1)123456789101112131415161718192021222324252627282930313233343536373839404142

SQLiteDatabase db = databaseHelper.getWritableDatabase();?
?db.execSQL(“update person set name=’呵呵’ where personid=1”);?
?db.close();?
“`?
(2)?
SQLiteDatabase db = databaseHelper.getWritableDatabase();?
ContentValues values = new ContentValues();?
?values.put(“name”, “呵呵”);//key為字段名,value為值?
db.update(“person”, values, “personid=?”, new String[]{“1”});?
db.close(); ?

上面代碼用于把person表中personid等于1的記錄的name字段的值改為“呵呵”。
---------------------?
原文:https://blog.csdn.net/qq_37237245/article/details/72677163?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的SQLlite在安卓中的基本详解和简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。