導航:首頁 > 操作系統 > androidsqlite事務

androidsqlite事務

發布時間:2023-01-16 01:42:31

『壹』 android開發 sqlite作用

SQLite簡介
Google為Andriod的較大的數據處理提供了SQLite,他在數據存儲、管理、維護等各方面都相當出色,功能也非常的強大。SQLite具備下列特點:

1.輕量級
使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
2.獨立性
SQLite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的「安裝」。
3.隔離性
SQLite 資料庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。
4.跨平台
SQLite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:Android。
5.多語言介面
SQLite 資料庫支持多語言編程介面。
6.安全性
SQLite 資料庫通過資料庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一資料庫讀取數據,但只能有一個可以寫入數據。
Android中的SQLite使用
首先創建資料庫類

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "mydata.db"; //資料庫名稱
private static final int version = 1; //資料庫版本

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(username varchar(20) not null , password varchar(60) not null );";
db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

}

SQLiteOpenHelper類介紹
SQLiteOpenHelper是SQLiteDatabase的一個幫助類,用來管理資料庫的創建和版本的更新。一般是建立一個類繼承它,並實現它的onCreate和onUpgrade方法。

方法名
方法描述

SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 構造方法,一般是傳遞一個要創建的資料庫名稱那麼參數
onCreate(SQLiteDatabase db) 創建資料庫時調用
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新時調用
getReadableDatabase() 創建或打開一個只讀資料庫
getWritableDatabase() 創建或打開一個讀寫資料庫
下面來介紹調用的方法
創建資料庫
這里特別的地方是通過調用了SQLiteOpenHelper類的getReadableDatabase()方法來實現創建一個資料庫的

1
2
3

DatabaseHelper database = new DatabaseHelper(this);//這段代碼放到Activity類中才用this
SQLiteDatabase db = null;
db = database.getReadalbeDatabase();

SQLiteDatabase類為我們提供了很多種方法,而較常用的方法如下

(返回值)方法名
方法描述

(int) delete(String table,String whereClause,String[] whereArgs) 刪除數據行的便捷方法
(long) insert(String table,String nullColumnHack,ContentValues values) 添加數據行的便捷方法
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs) 更新數據行的便捷方法
(void) execSQL(String sql) 執行一個SQL語句,可以是一個select或其他的sql語句
(void) close() 關閉資料庫
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 查詢指定的數據表返回一個帶游標的數據集
(Cursor) rawQuery(String sql, String[] selectionArgs) 運行一個預置的SQL語句,返回帶游標的數據集(與上面的語句最大的區別就是防止SQL注入)
數據的添刪改查分別可以通過2種途徑來實現
數據的添加
1.使用insert方法

1
2
3

ContentValues cv = new ContentValues();//實例化一個ContentValues用來裝載待插入的數據cv.put("username","Jack Johnson");//添加用戶名
cv.put("password","iLovePopMusic"); //添加密
db.insert("user",null,cv);//執行插入操作

2.使用execSQL方式來實現

1
2

String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL語句
db.execSQL(sql);//執行SQL語句

數據的刪除
同樣有2種方式可以實現

1
2
3

String whereClause = "username=?";//刪除的條件
String[] whereArgs = {"Jack Johnson"};//刪除的條件參數
db.delete("user",whereClause,whereArgs);//執行刪除

使用execSQL方式的實現

1
2

String sql = "delete from user where username='Jack Johnson'";//刪除操作的SQL語句
db.execSQL(sql);//執行刪除操作

數據修改
同上,仍是2種方式

1
2
3
4
5

ContentValues cv = new ContentValues();//實例化ContentValues
cv.put("password","iHatePopMusic");//添加要更改的欄位及內容
String whereClause = "username=?";//修改條件
String[] whereArgs = {"Jack Johnson"};//修改條件的參數
db.update("user",cv,whereClause,whereArgs);//執行修改

使用execSQL方式的實現

1
2

String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL語句
db.execSQL(sql);//執行修改

數據查詢
數據查詢相對前面幾種方法就復雜一些了,因為查詢會帶有很多條件
通過query實現查詢的
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
各參數說明:
table:表名稱
colums:列名稱數組
selection:條件子句,相當於where
selectionArgs:條件語句的參數數組
groupBy:分組
having:分組條件
orderBy:排序類
limit:分頁查詢的限制
Cursor:返回值,相當於結果集ResultSet
針對游標(Cursor)也提供了不少方法

方法名稱
方法描述

getCount() 總記錄條數
isFirst() 判斷是否第一條記錄
isLast() 判斷是否最後一條記錄
moveToFirst() 移動到第一條記錄
moveToLast() 移動到最後一條記錄
move(int offset) 移動到指定的記錄
moveToNext() 移動到嚇一條記錄
moveToPrevious() 移動到上一條記錄
getColumnIndex(String columnName) 獲得指定列索引的int類型值
實現代碼

1
2
3
4
5
6
7
8

Cursor c = db.query("user",null,null,null,null,null,null);//查詢並獲得游標
if(c.moveToFirst()){//判斷游標是否為空
for(int i=0;i<c.getCount();i++){
c.move(i);//移動到指定記錄
String username = c.getString(c.getColumnIndex("username");
String password = c.getString(c.getColumnIndex("password"));
}
}

通過rawQuery實現的帶參數查詢

1
2
3
4

Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
if(cursor.moveToFirst()) {
String password = c.getString(c.getColumnIndex("password"));
}

『貳』 android手機上sqllite插入數據的性能是多少

SQLite 因其小巧輕便被安卓系統廣泛採用,當然在操作小數據量時,差異並不明顯;但當 SQLite 在操作略大一點的數據時就顯得力不存心了,這時的 CRUD 操作對移動存儲設備的性能有著極大的要求,另外用戶體驗的良好性也對 SQLite 的性能優化提出了要求。那麼,當我們在操作大數據量時如何對 SQLite 進行優化呢?正確的操作是:開啟事務。下面我們通過採用不同的方式向資料庫中插入 10000 條數據來進行比較以體現開啟事務對 SQLite 性能提升方面所做出的貢獻。首先看一張截圖來進行一個感性的認識:

源碼及安裝文件下載方式一:SQLiteDataBase.zip
從上圖中我們會很清晰的看到通過普通方式插入 10000 條數據和開啟事務插入 10000 條數據之間的差異,整整差了 83 秒。下面我們來看測試代碼:

package cn.sunzn.sqlitedatabase;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

protected static final int SUCCESS_INSERT_TO_DB_ONE = 1;
protected static final int SUCCESS_INSERT_TO_DB_TWO = 2;
private EditText et_usedtime1;
private EditText et_usedtime2;
Handler handler = new Handler() {

public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SUCCESS_INSERT_TO_DB_ONE:
Integer usetime_one = (Integer) msg.obj;
et_usedtime1.setText("插入10000條數據耗時:" + usetime_one / 1000 + "秒");
break;
case SUCCESS_INSERT_TO_DB_TWO:
Integer usetime_two = (Integer) msg.obj;
et_usedtime2.setText("插入10000條數據耗時:" + usetime_two / 1000 + "秒");
break;
default:
break;
}
}
};

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

et_usedtime1 = (EditText) findViewById(R.id.et_usedtime1);
et_usedtime2 = (EditText) findViewById(R.id.et_usedtime2);
}

/**
* 1. 普通方式插入資料庫 10000 條數據
*/
public void insert1(View view) {
MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(getApplicationContext());
final SQLiteDatabase database = openHelper.getWritableDatabase();
if (database.isOpen()) {
new Thread() {
public void run() {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
ContentValues values = new ContentValues();
values.put("name", "tom:" + i);
database.insert("person", "_id", values);
}
database.close();
long end = System.currentTimeMillis();
int usetime_one = (int) (end - start);
Message message = new Message();
message.what = SUCCESS_INSERT_TO_DB_ONE;
message.obj = usetime_one;
handler.sendMessage(message);
};
}.start();
}
}

/**
* 2. 開啟事務插入資料庫 10000 條數據
*/
public void insert2(View view) {
MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(getApplicationContext());
final SQLiteDatabase database = openHelper.getWritableDatabase();
if (database.isOpen()) {
new Thread() {
public void run() {
long start = System.currentTimeMillis();
database.beginTransaction();
for (int i = 0; i < 10000; i++) {
ContentValues values = new ContentValues();
values.put("name", "tom:" + i);
database.insert("person", "_id", values);
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
long end = System.currentTimeMillis();
int usetime_two = (int) (end - start);
Message message = new Message();
message.what = SUCCESS_INSERT_TO_DB_TWO;
message.obj = usetime_two;
handler.sendMessage(message);
};
}.start();
}
}

public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}

為什麼只是開啟了一個事務就會有這么大的差距呢?很簡單,SQLite 預設為每個操作開啟了一個事務,那麼測試代碼循環插入 10000 次開啟了 10000 個事務,"事務開啟 + SQL 執行 + 事務關閉" 自然耗費了大量的時間,這也是後面顯式開啟事務後為什麼如此快的原因。

『叄』 Android資料庫SQLiteDatabase的update方法,whereClause參數怎麼添加多個條件

1. ACID事務

2. 零配置 – 無需安裝和管理配置

3.儲存在單一磁碟文件中的一個完整的資料庫

4.資料庫文件可以在不同位元組順序的機器間自由的共享

5.支持資料庫大小至2TB

6. 足夠小, 大致13萬行C代碼, 4.43M

7. 比一些流行的資料庫在大部分普通資料庫操作要快

8. 簡單, 輕松的API

9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定

10. 良好注釋的源代碼, 並且有著90%以上的測試覆蓋率

11. 獨立: 沒有額外依賴

12. 源碼完全的開源, 你可以用於任何用途, 包括出售它

13. 支持多種開發語言,C, C++, PHP, Perl, Java, C#,Python, Ruby等

SQLite雖然很小巧,但是支持的SQL語句不會遜色於其他開源資料庫,它支持的SQL包括:

ATTACH DATABASE

BEGIN TRANSACTION

comment

COMMIT TRANSACTION

COPY

CREATE INDEX

CREATE TABLE

CREATE TRIGGER

CREATE VIEW

DELETE

DETACH DATABASE

DROP INDEX

DROP TABLE

DROP TRIGGER

DROP VIEW

END TRANSACTION

EXPLAIN

expression

INSERT

ON CONFLICT clause

PRAGMA

REPLACE

ROLLBACK TRANSACTION

SELECT

UPDATE

同時它還支持事務處理功能等等。也有人說它象Microsoft的Access,有時候真的覺得有點象,但是事實上它們區別很大。比如SQLite 支持跨平台,操作簡單,能夠使用很多語言直接創建資料庫,而不象Access一樣需要Office的支持。如果你是個很小型的應用,或者你想做嵌入式開發,沒有合適的資料庫系統,那麼你可以考慮使用SQLite。到2013年10月17日最新版本是 3.8.1 。能在上面獲得源代碼和文檔。同時因為資料庫結構簡單,系統源代碼也不是很多,也適合想研究資料庫系統開發的專業人士.

『肆』 Android開發SQLite如何批量事務插入手機號至資料庫

解決方法:
添加事務處理,把5000條插入作為一個事務
dataBase.beginTransaction(); //手動設置開始事務
//數據插入操作循環
dataBase.setTransactionSuccessful(); //設置事務處理成功,不設置會自動回滾不提交
dataBase.endTransaction(); //處理完成

將資料庫「倒出來」:
sqlite3 film.db ".mp" > output.sql
利用輸出的資料,建立一個一模一樣的資料庫(加上以上指令,就是標準的SQL資料庫
備份了):
sqlite3 film.db < output.sql
在大量插入資料時,你可能會需要先打這個指令:
begin;
插入完資料後要記得打這個指令,資料才會寫進資料庫中:
commit;

『伍』 android如何將SQLite 3.7 WAL文件的內容合並到主資料庫文件中

在引入WAL機制之前,SQLite使用rollback journal機制實現原子事務。
rollback journal機制的原理是:在修改資料庫文件中的數據之前,先將修改所在分頁中的數據備份在另外一個地方,然後才將修改寫入到資料庫文件中;如果事務失敗,則將備份數據拷貝回來,撤銷修改;如果事務成功,則刪除備份數據,提交修改。
WAL機制的原理是:修改並不直接寫入到資料庫文件中,而是寫入到另外一個稱為WAL的文件中;如果事務失敗,WAL中的記錄會被忽略,撤銷修改;如果事務成功,它將在隨後的某個時間被寫回到資料庫文件中,提交修改。
同步WAL文件和資料庫文件的行為被稱為checkpoint(檢查點),它由SQLite自動執行,默認是在WAL文件積累到1000頁修改的時候;當然,在適當的時候,也可以手動執行checkpoint,SQLite提供了相關的介面。執行checkpoint之後,WAL文件會被清空。
在讀的時候,SQLite將在WAL文件中搜索,找到最後一個寫入點,記住它,並忽略在此之後的寫入點(這保證了讀寫和讀讀可以並行執行);隨後,它確定所要讀的數據所在頁是否在WAL文件中,如果在,則讀WAL文件中的數據,如果不在,則直接讀資料庫文件中的數據。
在寫的時候,SQLite將之寫入到WAL文件中即可,但是必須保證獨占寫入,因此寫寫之間不能並行執行。

『陸』 android sqlite禁止重復插入數據

1、使用唯一性約束,不過如果是在事務中批量提交時,一個失敗將導致整個事務rollback。
2、先用select查詢數據是否重復,再決定是否要插入此條數據,實現起來比較麻煩,特別是欄位較多時,效率方面未對比測試。
3、使用語句insert or ignore into table (fields) values (values);或replace into table (fields) values (values); 此法比較簡潔。需要注意的是,當表有一個PRIMARY KEY或UNIQUE索引才有意義。

『柒』 Android SQLite 支持嵌套事務嗎

setTransactionSuccessful()就比較簡單了:
public void setTransactionSuccessful() { // 標記當前事務成功 throwIfNoTransaction(); (); mTransactionStack.mMarkedSuccessful = true; //mTransactionStack指向的就是最近的一個事務 如圖 }

----------------------------------------------------------------------

執行beginTransaction():
當事務棧為空,說明沒有外層事務,獲取transaction,執行「BEGIN」,然後將transaction放入事務棧。
事務棧不為空,說明含有外層事務,獲取transaction,不執行「BEGIN」,將transaction放入事務棧。
執行endTransaction():
查看successful,當本事務成功且內層事務成功,才算成功;將該事務從事務棧移入事務池。
當事務棧不為空,說明仍有外層事務,如果successful為價,將該事物置為子事務失敗
當事務棧為空,說明已是最外層事務,successful則提交,否則回滾。
可以看到,嵌套事務中,無論哪一層事務出錯,都會自其開始直至最外層事務標記為false,回滾。只有每一層都標記成功,最後才成功。
需要注意的是,yield會對嵌套事務successful的標記產生影響,使得當前事務無論如何都標記為成功。android不推薦在嵌套事務中使用yield。

『捌』 在用android做項目,要用到SQLite資料庫的鎖,沒接觸過鎖,講下怎麼用,最好有例子 (滿意加分)

一般不直接使用鎖,你使用事務時,事務會自動加鎖或者解鎖的

閱讀全文

與androidsqlite事務相關的資料

熱點內容
初二多項式乘法速演算法 瀏覽:453
android多個布局文件 瀏覽:627
奔跑程序員 瀏覽:468
伺服器如何搭建類似github 瀏覽:292
明日之後安卓太卡怎麼辦 瀏覽:502
如何使用命令方塊找到村莊 瀏覽:766
泛函壓縮映像原理 瀏覽:521
win10清除文件夾瀏覽記錄 瀏覽:964
如何查看伺服器域中所有服務 瀏覽:384
學mastercam91編程要多久 瀏覽:999
如何查伺服器地址和埠 瀏覽:911
教學雲平台app怎麼下載 瀏覽:389
單片機510教學視頻 瀏覽:624
陝西信合app怎麼查看自己的存款 瀏覽:663
風冷冰箱有壓縮機 瀏覽:274
android實現wifi連接wifi 瀏覽:669
飛豬app怎麼幫別人值機 瀏覽:924
筆記本開我的世界伺服器地址 瀏覽:546
怎樣隱藏bat命令 瀏覽:127
android開發創意 瀏覽:138