❶ 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"));
}
❷ 如何使用SQLite,Android上SQLite的最佳實踐
SQLite3是目前最新的SQLite版本。可以從網站上下載SQLite3的源代碼(本書使用的版本是sqlite-3.6.12.tar.gz)。
解壓縮後進入sqlite-3.6.12的根目錄,首先命令「./configure」生成Makefile文件,接著運行命令「make」對源代碼進行編譯,最後運行命令「make install」安裝SQLite3。安裝完畢後,可以運行命令sqlite3查看SQLite3是否能正常運行,如下所示:
[root@localhost ~]# sqlite3
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
可以看到,SQLite3啟動後會停留在提示符sqlite>處,等待用戶輸入SQL語句。
在使用SQLite3前需要先了解下SQLite3支持的數據類型。SQLite3支持的基本數據類型主要有以下幾類:
NULL
NUMERIC
INTEGER
REAL
TEXT
SQLite3會自動把其他數據類型轉換成以上5類基本數據類型,轉換規則如下所示:
char、clob、test、varchar—> TEXT
integer—>INTEGER
real、double、float—> REAL
blob—>NULL
其餘數據類型都轉變成NUMERIC
下面通過一個實例來演示SQLite3的使用方法。
新建一個資料庫
新建資料庫test.db(使用.db後綴是為了標識資料庫文件)。在test.db中新建一個表test_table,該表具有name,、sex、age三列。SQLite3的具體操作如下所示:
[root@localhost home]# sqlite3 test.db
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table test_table(name, sex, age);
如果資料庫test.db已經存在,則命令「sqlite3 test.db」會在當前目錄下打開test.db。如果資料庫test.db不存在,則命令「sqlite3 test.db」會在當前目錄下新建資料庫test.db。為了提高效率,SQLite3並不會馬上創建test.db,而是等到第一個表創建完成後才會在物理上創建資料庫。
由於SQLite3能根據插入數據的實際類型動態改變列的類型,所以在create語句中並不要求給出列的類型。
創建索引
為了加快表的查詢速度,往往在主鍵上添加索引。如下所示的是在name列上添加索引的過程。
sqlite> create index test_index on test_table(name);
操作數據
如下所示的是在test_table中進行數據的插入、更新、刪除操作:
sqlite> insert into test_table values ('xiaoming', 'male', 20);
sqlite> insert into test_table values ('xiaohong', 'female', 18);
sqlite> select * from test_table;
xiaoming|male|20
xiaohong|female|18
sqlite> update test_table set age=19 where name = 'xiaohong';
sqlite> select * from test_table;
xiaoming|male|20
xiaohong|female|19
sqlite> delete from test_table where name = 'xiaoming';
sqlite> select * from test_table;
xiaohong|female|19
批量操作資料庫
如下所示的是在test_table中連續插入兩條記錄:
sqlite> begin;
sqlite> insert into test_table values ('xiaoxue', 'female', 18);
sqlite> insert into test_table values ('xiaoliu', 'male', 20);
sqlite> commit;
sqlite> select * from test_table;
xiaohong|female|19
xiaoxue|male|18
xiaoliu|male|20
運行命令commit後,才會把插入的數據寫入資料庫中。
資料庫的導入導出
如下所示的是把test.db導出到sql文件中:
[root@localhost home]# sqlite3 test.db ".mp" > test.sql;
test.sql文件的內容如下所示:
BEGIN TRANSACTION;
CREATE TABLE test_table(name, sex, age);
INSERT INTO "test_table" VALUES('xiaohong','female',19);
CREATE INDEX test_index on test_table(name);
COMMIT;
如下所示的是導入test.sql文件(導入前刪除原有的test.db):
[root@localhost home]# sqlite3 test.db < test.sql;
通過對test.sql文件的導入導出,可以實現資料庫文件的備份。
11.2.2 SQLite3的C介面
以上介紹的是SQLite3資料庫的命令操作方式。在實際使用中,一般都是應用程序需要對資料庫進行訪問。為此,SQLite3提供了各種編程語言的使用介面(本書介紹C語言介面)。SQLite3具有幾十個C介面,下面介紹一些常用的C介面。
sqlite_open
作用:打開SQLite3資料庫
原型:int sqlite3_open(const char *dbname, sqlite3 **db)
參數:
dbname:資料庫的名稱;
db:資料庫的句柄;
sqlite_colse
作用:關閉SQLite3資料庫
原型:int sqlite_close(sqlite3 *db)
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
int main()
{
int rc;
rc= sqlite3_open("test.db", &db);
if(rc)
{
printf("can't open database!\n");
}
else
{
printf("open database success!\n");
}
sqlite3_close(db);
return 0;
}
運行命令「gcc –o test test.c –lsqlite3」進行編譯,運行test的結果如下所示:
[root@localhost home]# open database success!
sqlite_exec
作用:執行SQL語句
原型:int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg)
參數:
db:資料庫;
sql:SQL語句;
callback:回滾;
errmsg:錯誤信息
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static char *errmsg=NULL;
int main()
{
int rc;
rc = sqlite3_open("test.db", &db);
rc = sqlite3_exec(db,"insert into test_table values('bao', 'male', 24)", 0, 0, &errmsg);
if(rc)
{
printf("exec fail!\n");
}
else
{
printf("exec success!\n");
}
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
exec success!
[root@localhost home]# sqlite3 test.db
SQLite version 3.6.11
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from test_table;
bao|male|24
sqlite3_get_table
作用:執行SQL查詢
原型:int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn, char **pzErrmsg)
參數:
db:資料庫;
zSql:SQL語句;
pazResult:查詢結果集;
pnRow:結果集的行數;
pnColumn:結果集的列數;
errmsg:錯誤信息;
sqlite3_free_table
作用:注銷結果集
原型:void sqlite3_free_table(char **result)
參數:
result:結果集;
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static char **Result=NULL;
static char *errmsg=NULL;
int main()
{
int rc, i, j;
int nrow;
int ncolumn;
rc= sqlite3_open("test.db", &db);
rc= sqlite3_get_table(db, "select * from test_table", &Result, &nrow, &ncolumn,
&errmsg);
if(rc)
{
printf("query fail!\n");
}
else
{
printf("query success!\n");
for(i = 1; i <= nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%s | ", Result[i * ncolumn + j]);
}
printf("\n");
}
}
sqlite3_free_table(Result);
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
query success!
xiaohong | female | 19 |
xiaoxue | female | 18 |
xiaoliu | male | 20 |
bao | male | 24 |
sqlite3_prepare
作用:把SQL語句編譯成位元組碼,由後面的執行函數去執行
原型:int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **stmt, const char **pTail)
參數:
db:資料庫;
zSql:SQL語句;
nByte:SQL語句的最大位元組數;
stmt:Statement句柄;
pTail:SQL語句無用部分的指針;
sqlite3_step
作用:步步執行SQL語句位元組碼
原型:int sqlite3_step (sqlite3_stmt *)
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static sqlite3_stmt *stmt=NULL;
int main()
{
int rc, i, j;
int ncolumn;
rc= sqlite3_open("test.db", &db);
rc=sqlite3_prepare(db,"select * from test_table",-1,&stmt,0);
if(rc)
{
printf("query fail!\n");
}
else
{
printf("query success!\n");
rc=sqlite3_step(stmt);
ncolumn=sqlite3_column_count(stmt);
while(rc==SQLITE_ROW)
{
for(i=0; i<2; i++)
{
printf("%s | ", sqlite3_column_text(stmt,i));
}
printf("\n");
rc=sqlite3_step(stmt);
}
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
query success!
xiaohong | female | 19 |
xiaoxue | female | 18 |
xiaoliu | male | 20 |
bao | male | 24 |
在程序中訪問SQLite3資料庫時,要注意C API的介面定義和數據類型是否正確,否則會得到錯誤的訪問結果。
❸ 如何在android自帶的sqlite3中創建一個資料庫文件,請大蝦門詳細指導
Android中提供4種數據存儲的方法:(1)SharedPreferences,用鍵值對的方式來存儲數據,是一種輕量級的存儲機制,可以存儲一些屬性等。(2)Files:文件輸入輸出流的方式存儲數據,FileInputStream和FileOutputStream。在Android中,文件是一個應用程序私有的,一個應用程序無法讀寫其他應用程序的文件。寫入SD卡除外。(3)SQLite(4)網路(這個不算吧~~~--!)。
SQLite:
(1)創建和打開資料庫可以使用方法openOrCreateDatabase,它會自動去檢測是否存在資料庫,如果存在則打開,如果不存在則創建一個資料庫;成功返回一個SQliteDatabase對象。(2)創建一張表通過SQL語句實現,調用sqliteDatabase對象的execSQL方法,執行創建表的SQL語句。
(3)向數據表中添加一條記錄可以直接通過SQL語句實現,也可以使用ContentValue對象,ContentValue對象是一個Map,Key是欄位名,Value是值。Cv.put(key,value);然後調用sqliteDatabase對象的
insert(tableName,null,cv)方法插入數據。
(4)刪除數據可以直接執行SQL,也可以執行sqliteDatabase的delete方法。
(5)同理修改數據也是執行SQL或調用update方法,需要傳入ContenValue的對象表示修改的內容。
(6)關閉資料庫sqliteDatabase.close();
(7)刪除指定表調用SQL語句即可。
(8)查詢:在Android中查詢數據是通過Cursor類來實現的,當我們使用SQLiteDatabase.query()方法時,會得到一個Cursor對象,Cursor對象指向的是每條數據。例如cur.moveToFirst();cur.moveToNext();等。在實際開發中,為了能夠更好地管理和維護資料庫,我們會封裝一個繼承自SQLiteOpenHelper類的資料庫操作類。SQLiteOpenHelper的構造方法中分別需要傳入Context、資料庫名稱、CursorFactory(一般默認null)、資料庫版本號。在SQLiteOpenHelper中首先執行的是onCreate方法(當資料庫第一次被創建時)。在構造函數中並沒有真正創建資料庫,而是調用getWriteableDatabase或者getReadableDatabase方法時才真正去創建資料庫,並且返回一個SQLiteDatabase對象。
❹ android sqlite怎麼實現
資料庫的創建
創建文件
1.聲明文件對象,文件是不會被創建出來的。
File file = new File("文件名稱");
2.寫文件(文件才會被創建出來)
FileOutputStream fos = new FileOutputStream(file);
fos.write("hdahfdsaklfh".getbytes());
創建資料庫
1.實現SQLiteOpenHelper的子類PersonSQLiteOpenHelper
java">{
publicPersonSQLiteOpenHelper(Contextcontext,Stringname,
CursorFactoryfactory,intversion){
super(context,name,factory,version);
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidonCreate(SQLiteDatabasearg0){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//TODOAuto-generatedmethodstub
}
}
2.getWritableDatabase/getReadableDatabase()
新建TestPersonDB.java
//.
//在資料庫第一次創建的時候執行的方法
//如果資料庫已經創建完畢,就不會再去執行了。
//適合做資料庫表結構的初始化操作
//db代表的就是當前的資料庫
@Override
publicvoidonCreate(SQLiteDatabasedb){
//初始化資料庫的表結構
db.execSQL("createtableperson(,namevarchar(20),numbervarchar(20))");
}
❺ android上如何使用sqlite資料庫
SQLite
一個非常流行的嵌入式資料庫,它支持
SQL
語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla,
PHP,
Python)都使用了
SQLite.
Android
開發中使用
SQLite
資料庫
Activites
可以通過
Content
Provider
或者
Service
訪問一個資料庫。下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。
創建資料庫
Android
不自動提供資料庫。在
Android
應用程序中使用
SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android
提供了
SQLiteOpenHelper
幫助你創建一個資料庫,你只要繼承
SQLiteOpenHelper
類,就可以輕松的創建資料庫。SQLiteOpenHelper
類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。SQLiteOpenHelper
的子類,至少需要實現三個方法:
構造函數,調用父類
SQLiteOpenHelper
的構造函數。這個方法需要四個參數:上下文環境(例如,一個
Activity),資料庫名字,一個可選的游標工廠(通常是
Null),一個代表你正在使用的資料庫模型版本的整數。
onCreate()方法,它需要一個
SQLiteDatabase
對象作為參數,根據需要對這個對象填充表和初始化數據。
onUpgrage()
方法,它需要三個參數,一個
SQLiteDatabase
對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
❻ 要怎麼實現android的sqlite 和 網站上的SqlServer的數據同步
1、查詢SQL中的所有表: Select TABLE_NAME FROM 資料庫名稱.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 執行之後,就可以看到資料庫中所有屬於自己建的表的名稱 2、查詢SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id Where (dbo.sysobjects.xtype = '伍兆u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties')) 3、在Sql查詢分析器,還有一個簡單的查詢方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'" 執行完之後,就可以看到資料庫塌橘敬中所有用戶表的信息 4、查詢總存儲過程數:select count(*) 總存儲過程數 from sysobjects where xtype='p' 附:xtype類型D = 默認值或 DEFAULT 約束
F = FOREIGN KEY 約束L = 日誌FN = 標量函數
IF = 內嵌表函數
P = 存儲過程
PK = PRIMARY KEY 約束(類型是 K)
RF = 復制篩選存儲過程S = 系統表TF = 表函數
TR = 觸發器U = 用戶表UQ = UNIQUE 約束(類型是 K)V = 視圖X = 擴展存儲過程 另:在sqlserver中取得某個資料庫中所有表名的sql語句 select sysobjects.name from sysobjects.xtype ='U';SELECT name
WHERE (xtype = '團慎U') 在資料庫的sysobjects表裡有這個資料庫全部表的信息, xtype值為'U'的就是表名 注意:一般通過上述方法獲得全部用戶表示都會有一個dtproperties表,SQLSERVER 默認它也是用戶表,想要從用戶表中排出,需要加上限定條件 status>0,即:select * from sysobjects where xtype='U' and status>0
❼ android怎麼實現sqlite的增刪改查
SQL語句大全
--語 句 功 能
--數據操作
SELECT --從資料庫表中檢索數據行和列
INSERT --向資料庫表添加新數據行
DELETE --從資料庫表中刪除數據行
UPDATE --更新資料庫表中的數據
--數據定義
CREATE TABLE --創建一個資料庫表
DROP TABLE --從資料庫中刪除表
ALTER TABLE --修改資料庫表結構
CREATE VIEW --創建一個視圖
DROP VIEW --從資料庫中刪除視圖
CREATE INDEX --為資料庫表創建一個索引
DROP INDEX --從資料庫中刪除索引
CREATE PROCEDURE --創建一個存儲過程
DROP PROCEDURE --從資料庫中刪除存儲過程
CREATE TRIGGER --創建一個觸發器
DROP TRIGGER --從資料庫中刪除觸發器
CREATE SCHEMA --向資料庫添加一個新模式
DROP SCHEMA --從資料庫中刪除一個模式
CREATE DOMAIN --創建一個數據值域
ALTER DOMAIN --改變域定義
DROP DOMAIN --從資料庫中刪除一個域
--數據控制
GRANT --授予用戶訪問許可權
DENY --拒絕用戶訪問
REVOKE --解除用戶訪問許可權
--事務控制
COMMIT --結束當前事務
ROLLBACK --中止當前事務
SET TRANSACTION --定義當前事務數據訪問特徵
--程序化SQL
DECLARE --為查詢設定游標
EXPLAN --為查詢描述數據訪問計劃
OPEN --檢索查詢結果打開一個游標
FETCH --檢索一行查詢結果
CLOSE --關閉游標
PREPARE --為動態執行准備SQL 語句
EXECUTE --動態地執行SQL 語句
DESCRIBE --描述准備好的查詢
---局部變數
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'
---全局變數
---必須以@@開頭
--IF ELSE
❽ 如何使用SQLite,Android上SQLite的最佳實踐
前些時候看到興趣小組里有人問「Android上SQLite的最佳實踐」是什麼,好奇地搜了一下,確實沒有一個好一點的指導文檔,平時的使用也只是簡單的拷貝code,並沒有深入的研究過。以下是我看到的Kevin關於其使用的心得,原文的大體的意思是:
Android例子涵蓋了一些Sqlite的基本用法,但它們並沒有深入地給出合理的使用方法,更重要的是,不合理的使用方法。大多數例子和文檔只是涉及最基本的資料庫查詢,或者教你如何創建一個ContentProvider。從來不提及的地方像:
· 什麼地方創建和保存SQLiteOpenHelper實例?
· 可以有多少個實例?
· 多線程同時訪問資料庫有沒有什麼要擔心的?
基本的內容是,你可以歷宏嘩任意次數地連接Sqlite資料庫,而且Android系統也支持你這樣做。Sqlite擁有文件級別的鎖,用來同步訪問和防止錯誤。如果你只知道這些,那麼,將會給你帶來很大的痛苦。開源的一個好處是,你可以深入代碼一探究竟。從代碼和一些測試中,我了解到以下事實:
· Sqlite擁有文件級別的鎖。許多線程可以同時讀,但只有一個可以寫。鎖阻止多個同時寫入。
· Android在SQLiteDatabase中實現了一些java鎖來確保動作是同步進行。
· 如果你用多個線程瘋狂地訪問資料庫,你的資料庫不會(或不應該)崩潰。
沒提到的是,如果你通過多個不同的真實連接同時寫資料庫,其中的某個會失敗,它不會等到前一個完成後繼續寫入。簡單地,不會寫入你的改變,更糟糕的是,你也得不到一個異常,只是在LogCat中輸出一些message,僅此而已。
SQLiteOpenHelper類做了一些有趣的事。盡管它有方法可以獲得一個只讀的連接和可讀寫的連接,但實質上它們是同一個連接。假設沒有文件寫錯誤的話,只讀的連接實質上就是一個可讀寫的連接。有趣吧。因此,如果你的app中使用一個helper的話,即便從多線程中使用,你也從未使用多個連接。
同樣,一個helper中只有一個SQLiteDatabase的實例,這個實例中實現了一些java鎖。因此,當你絕喊正在執行資料庫的操作時,其它db的操作都將鎖定。即便是你使用多個線程來做這些事以便優化資料庫的性能,壞消息,沒有什麼用。
按照我的認識,SQLite工作的方式,基本上不可能會破壞你的資料庫,除非代碼里有bug或者有硬體問題。
因此,我推薦這樣使用:創建一個SQLiteOpenHelper靜態對象。什麼時候去close它呢?不需要。當app關閉,它會自動釋放文件引用。
但是,會不會有「close() was never explicitly called on database」異常呢?
如果你注意的話,當連接掛在那裡的時候,你沒有得到那個異常。你只是在連接已經建立,而你又嘗試打開另一個時才會有異常。因此,你只需要打開一次連接。
像這樣來使用:
public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
private static DatabaseHelper instance;public static synchronized DatabaseHelper getHelper(Context context)
{
if (instance == null)
instance = new DatabaseHelper(context);
肢行
return instance;
}
//Other stuff...
}
❾ Android繼承SQLiteOpenHelper實現
千鋒扣丁學歲毀堂Android開發為差喚您解答:
1.實現一個繼承SQLiteOpenHelper的類
view plain to clipboardprint?
01.import android.content.ContentValues;
02.import android.content.Context;
03.import android.database.Cursor;
04.import android.database.sqlite.SQLiteDatabase;
05.import android.database.sqlite.SQLiteOpenHelper;
06.public class DBHelper extends SQLiteOpenHelper{
07.private static final String DB_NAME="coll.db";
08.private static final String TBL_NAME="CollTbl"虛雀凱;
09.private static final String CREATE_TBL="create table"
10.+"CollTbl(_id integer primary key autoincrement,name text,url text,desc text)";
11.
12.private SQLiteDatabase db;
13.DBHelper(Context c){
14.super(c,DB_NAME,null,2);
15.}
16.@Override 17.public void onCreate(SQLiteDatabase db){
18.this.db=db;
19.db.execSQL(CREATE_TBL);
20.}
21.public void insert(ContentValues values){
22.SQLiteDatabase db=getWritableDatabase();
23.db.insert(TBL_NAME,null,values);
24.db.close();
25.}
26.public Cursor query(){
27.SQLiteDatabase db=getWritableDatabase();
28.Cursor c=db.query(TBL_NAME,null,null,null,null,null,null);
29.return c;
30.}
31.public void del(int id){
32.if(db==null)
33.db=getWritableDatabase();
34.db.delete(TBL_NAME,"_id=?",new String{String.valueOf(id)});
35.}
36.public void close(){
37.if(db!=null)
38.db.close();
39.}
40.@Override 41.public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
42.}
43.}
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper{
private static final String DB_NAME="coll.db";
private static final String TBL_NAME="CollTbl";
private static final String CREATE_TBL="create table"
+"CollTbl(_id integer primary key autoincrement,name text,url text,desc text)";
private SQLiteDatabase db;
DBHelper(Context c){
super(c,DB_NAME,null,2);
}
@Override public void onCreate(SQLiteDatabase db){
this.db=db;
db.execSQL(CREATE_TBL);
}
public void insert(ContentValues values){
SQLiteDatabase db=getWritableDatabase();
db.insert(TBL_NAME,null,values);
db.close();
}
public Cursor query(){
SQLiteDatabase db=getWritableDatabase();
Cursor c=db.query(TBL_NAME,null,null,null,null,null,null);
return c;
}
public void del(int id){
if(db==null)
db=getWritableDatabase();
db.delete(TBL_NAME,"_id=?",new String{String.valueOf(id)});
}
public void close(){
if(db!=null)
db.close();
}
@Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}
}
2.創建一個錄入數據的類
view plain to clipboardprint?
01.import android.app.Activity;
02.import android.content.ContentValues;
03.import android.content.Intent;
04.import android.os.Bundle;
05.import android.view.View;
06.import android.view.View.OnClickListener;
07.import android.widget.Button;
08.import android.widget.EditText;
09.public class AddActivity extends Activity{
10.private EditText et1,et2,et3;
11.private Button b1;
12.@Override 13.public void onCreate(Bundle savedInstanceState){
14.super.onCreate(savedInstanceState);
15.setContentView(R.layout.add);
16.this.setTitle("添加收藏信息");
17.et1=(EditText)findViewById(R.id.EditTextName);
18.et2=(EditText)findViewById(R.id.EditTextUrl);
19.et3=(EditText)findViewById(R.id.EditTextDesc);
20.b1=(Button)findViewById(R.id.ButtonAdd);
21.b1.setOnClickListener(new OnClickListener(){
22.public void onClick(View v){
23.String name=et1.getText().toString();
24.String url=et2.getText().toString();
25.String desc=et3.getText().toString();
26.ContentValues values=new ContentValues();
27.values.put("name",name);
28.values.put("url",url);
29.values.put("desc",desc);
30.DBHelper helper=new DBHelper(getApplicationContext());
31.helper.insert(values);
32.Intent intent=new Intent(AddActivity.this,
33.QueryActivity.class);
34.startActivity(intent);
35.}
36.});
37.}
38.}
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class AddActivity extends Activity{
private EditText et1,et2,et3;
private Button b1;
@Override public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
this.setTitle("添加收藏信息");
et1=(EditText)findViewById(R.id.EditTextName);
et2=(EditText)findViewById(R.id.EditTextUrl);
et3=(EditText)findViewById(R.id.EditTextDesc);
b1=(Button)findViewById(R.id.ButtonAdd);
b1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
String name=et1.getText().toString();
String url=et2.getText().toString();
String desc=et3.getText().toString();
ContentValues values=new ContentValues();
values.put("name",name);
values.put("url",url);
values.put("desc",desc);
DBHelper helper=new DBHelper(getApplicationContext());
helper.insert(values);
Intent intent=new Intent(AddActivity.this,
QueryActivity.class);
startActivity(intent);
}
});
}
}