當前位置:首頁 » 數據倉庫 » ios查看sqlite資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

ios查看sqlite資料庫

發布時間: 2023-02-26 02:02:54

『壹』 ios開發怎麼匹配sqlite資料庫裡面數據

SQPte 一個非常流行的嵌入式資料庫,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQPte. SQPte 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQPte 通過利用虛擬機和虛擬資料庫引擎(VDBE),使調試、修改和擴展 SQPte 的內核變得更加方便。 圖 1. SQPte 內部結構 SQPte 基本上符合 SQL-92 標准,和其他的主要 SQL 資料庫沒什麼區別。它的優點就是高效,Android 運行時環境包含了完整的 SQPte。 SQPte 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQPte 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQPte 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQPte 稱這為“弱類型”(manifest typing.)。 此外,SQPte 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FPL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQPte 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。 Android 集成了 SQPte 資料庫 Android 在運行時(run-time)集成了 SQPte,所以每個 Android 應用程序都可以使用 SQPte 資料庫。對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQPte 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供了一些新的 API 來使用 SQPte 資料庫,Android 開發中,程序員需要學使用這些 API。 資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQPte 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。 創建資料庫 Android 不自動提供資料庫。在 Android 應用程序中使用 SQPte,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQPteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQPteOpenHelper 類,就可以輕松的創建資料庫。SQPteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。SQPteOpenHelper 的子類,至少需要實現三個方法: 構造函數,調用父類 SQPteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 NPl),一個代表你正在使用的資料庫模型版本的整數。 onCreate()方法,它需要一個 SQPteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。 onUpgrage() 方法,它需要三個參數,一個 SQPteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。 下面示例代碼展示了如何繼承 SQPteOpenHelper 創建資料庫: pubPc class DatabaseHelper extends SQPteOpenHelper { DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) { super(context, name, cursorFactory, version); } @Override pubPc void onCreate(SQPteDatabase db) { // TODO 創建資料庫後,對資料庫的操作 } @Override pubPc void onUpgrade(SQPteDatabase db, int PdVersion, int newVersion) { // TODO 更改資料庫版本的操作 } @Override pubPc void onOpen(SQPteDatabase db) { super.onOpen(db); // TODO 每次成功打開資料庫後首先被執行 } } 接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQPteDatabase 實例,具體調用那個方法,取決於你是否需要改變資料庫的內容: db=(new DatabaseHelper(getContext())).getWritableDatabase(); return (db == nPl) ? false : true; 上面這段代碼會返回一個 SQPteDatabase 類的實例,使用這個對象,你就可以查詢或者修改資料庫。 當你完成了對資料庫的操作(例如你的 Activity 已經關閉),需要調用 SQPteDatabase 的 Close() 方法來釋放掉資料庫連接。 創建表和索引 為了創建表和索引,需要調用 SQPteDatabase 的 execSQL() 方法來執行 DDL 語句。如果沒有異常,這個方法沒有返回值。 例如,你可以執行如下代碼: db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);"); 這條語句會創建一個名為 mytable 的表,表有一個列名為 _id,並且是主鍵,這列的值是會自動增長的整數(例如,當你插入一行時,SQPte 會給這列自動賦值),另外還有兩列:title( 字元 ) 和 value( 浮點數 )。 SQPte 會自動為主鍵列創建索引。 通常情況下,第一次創建資料庫時創建了表和索引。如果你不需要改變表的 schema,不需要刪除表和索引 . 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。 給表添加數據 上面的代碼,已經創建了資料庫和表,現在需要給表添加數據。有兩種方法可以給表添加數據。 像上面創建表一樣,你可以使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL() 方法適用於所有不返回結果的 SQL 語句。例如: db.execSQL("INSERT INTO widgets (name, inventory)"+ "VALUES ('Sprocket', 5)"); 另一種方法是使用 SQPteDatabase 對象的 insert(), update(), delete() 方法。這些方法把 SQL 語句的一部分作為參數。示例如下: ContentValues cv=new ContentValues(); cv.put(Constants.TITLE, "example title"); cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I); db.insert("mytable", getNPlCPumnHack(), cv); update()方法有四個參數,分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 條件和可選的填充 WHERE 語句的字元串,這些字元串會替換 WHERE 條件中的“?”標記。update() 根據條件,更新指定列的值,所以用 execSQL() 方法可以達到同樣的目的。 WHERE 條件和其參數和用過的其他 SQL APIs 類似。例如: String[] parms=new String[] {"this is a string"}; db.update("widgets", replacements, "name=?", parms); delete() 方法的使用和 update() 類似,使用表名,可選的 WHERE 條件和相應的填充 WHERE 條件的字元串。 查詢資料庫 類似 INSERT, UPDATE, DELETE,有兩種方法使用 SELECT 從 SQPte 資料庫檢索數據。 1 .使用 rawQuery() 直接調用 SELECT 語句; 使用 query() 方法構建一個查詢。 Raw Queries正如 API 名字,rawQuery() 是最簡單的解決方法。通過這個方法你就可以調用 SQL SELECT 語句。例如: Cursor c=db.rawQuery( "SELECT name FROM sqPte_master WHERE type='table' AND name='mytable'", nPl); 在上面例子中,我們查詢 SQPte 系統表(sqPte_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。如果查詢是動態的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用 query() 方法會方便很多。 RegPar Queriesquery() 方法用 SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要獲取的欄位名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。除了表名,其他參數可以是 nPl。所以,以前的代碼段可以可寫成: String[] cPumns={"ID", "inventory"}; String[] parms={"snicklefritz"}; Cursor resPt=db.query("widgets", cPumns, "name=?",parms, nPl, nPl, nPl); 使用游標不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQPte 資料庫游標,使用游標,你可以:通過使用 getCount() 方法得到結果集中有多少記錄;通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;通過 getCPumnNames() 得到欄位名;通過 getCPumnIndex() 轉換成欄位號;通過 getString(),getInt() 等方法得到給定欄位當前記錄的值;通過 requery() 方法重新執行查詢得到游標;通過 close() 方法釋放游標資源;例如,下面代碼遍歷 mytable 表 Cursor resPt=db.rawQuery("SELECT ID, name, inventory FROM mytable"); resPt.moveToFirst(); while (!resPt.isAfterLast()) { int id=resPt.getInt(0); String name=resPt.getString(1); int inventory=resPt.getInt(2); // do something usefP with these resPt.moveToNext(); } resPt.close(); 在 Android 中使用 SQPte 資料庫管理工具 在其他資料庫上作開發,一般都使用工具來檢查和處理資料庫的內容,而不是僅僅使用資料庫的 API。使用 Android 模擬器,有兩種可供選擇的方法來管理資料庫。首先,模擬器綁定了 sqPte3 控制台程序,可以使用 adb shell 命令來調用他。只要你進入了模擬器的 shell,在資料庫的路徑執行 sqPte3 命令就可以了。資料庫文件一般存放 在:/data/data/your.app.package/databases/your-db-name如果你喜歡使用更友好的工具,你 可以把資料庫拷貝到你的開發機上,使用 SQPte-aware 客戶端來操作它。這樣的話,你在一個資料庫的拷貝上操作,如果你想要你的修改能反映到設備上,你需要把資料庫備份回去。把資料庫從設備上考出來,你可以使 用 adb pPl 命令(或者在 IDE 上做相應操作)。存儲一個修改過的資料庫到設備上,使用 adb push 命令。一個最方便的 SQPte 客戶端是 FireFox SQPte Manager 擴展,它可以跨所有平台使用。 圖 2. SQPte Manager 結束語 如果你想要開發 Android 應用程序,一定需要在 Android 上存儲數據,使用 SQPte 資料庫是一種非常好的選擇。本文介紹了如何在 Android 應用程序中使用 SQPte 資料庫 ,主要介紹了在 Android 應用程序中使用 SQPte 創建資料庫和表、添加數據、更新和檢索數據,還介紹了比較常用的 SQPte 管理工具,通過閱讀本文,你可以在 Android 中輕松操作 SQPte 資料庫。

『貳』 ios中sqlite3查詢以特定字元開頭

..where IDNumber like '5325%%' limit 5

『叄』 ios 怎樣打開sqlite資料庫

iOS 上的sqlite資料庫比較好添加,一般只需要以下兩個步驟:
1. 添加sqlite3.dylib,可以通過工程->添加framework和library的方式來添加,位置一般在/usr/lib/libsqlite.dylib
2. 添加sqlite頭文件,一般在/usr/include下。

這樣准備工作就做完了。
創建sqlite db:
sqlite3 *database
sqlite3_open(DB_Path, &database);

『肆』 iOS簡單的多表查詢以及SQLite注意點

多表查詢

假如有兩張表:

表A:

表B:

這里我們是通過相同列名departmentNumber來進行條件查詢相關信息:

1.內連接查詢:返回的結果只有滿足departmentNumber相等的結果

sql語句(有兩種方式):

```

-->select a.name, b.name from A as a, B as b where a.departmentNumber = b.departmentNumber

-->select a.name, b.name from A as a  inner join  B as b on a.departmentNumber = b.departmentNumber

```

查詢結果:

2.左外鏈接查詢:返回的結果只和左邊的表有關(這里假定A是左邊的表),右邊表如果沒有對應值,就為NULL

sql語句:

```

-->select a.name, b.name from A as a  left outer join  B as b on a.departmentNumber= b.departmentNumber

```

返回結果:

3.右外鏈接查詢:返回的結果只和右邊的表有關(這里假定B是右表),那麼如果左邊表是沒有對應值,就為NULL

sql語句:

```

-->select a.name, b.name from A as a  right OUTER join  B as b on a.departmentNumber = b.departmentNumber

```

返回結果:

4.完全外鏈接查詢:想獲取兩個表所有信息,如果兩個表內沒有對應值的就用NULL表示

sql語句:

```

-->select a.name, b.name from B as b  full OUTER join  A as a on a.departmentNumber = b.departmentNumber

```

返回結果:

注意點:在sqlite中是不支持右外連接和完全外鏈接的,但是可以通過以下方式來進行連接:

1.sqlite中的右外連接:將左外連接的表換個順序就可以了

```

-->select a.name, b.name from B as B  left outer join  A as A on a.departmentNumber = b.departmentNumber

```

返回結果:

2.sqlite中的完全外鏈接:用關鍵字union將兩句連接起來進行合並

```

-->select a.name, b.name from B as b left OUTER A as a on a.departmentNumber = b.departmentNumber

UNION

select a.name, b.name from A as a left outer B as b on a.departmentNumber = b.departmentNumber

```

返回結果:

『伍』 怎麼看到ios sqlite資料庫

IOS8以前版本, 如果是模擬器的話, 在這個路徑中找到你的應用: /Users/你的用戶名/Library/Application Support/iPhone Simulator/5.1/Applications/應用目錄 IOS8在以下路徑中找到你的應用 /Users/username/Library/Developer/CoreSimulator/Dev...

『陸』 ios 從哪些方面去做sqlite 資料庫的優化

先來看看.h文件

#import <Foundation/Foundation.h>
#import <sqlite3.h>

#define kFilename @"testdb.db"
@class sqlTestList;
@interface sqlService : NSObject {
sqlite3 *_database;

}

@property (nonatomic) sqlite3 *_database;
-(BOOL) createTestList:(sqlite3 *)db;//創建資料庫
-(BOOL) insertTestList:(sqlTestList *)insertList;//插入數據
-(BOOL) updateTestList:(sqlTestList *)updateList;//更新數據
-(NSMutableArray*)getTestList;//獲取全部數據
- (BOOL) deleteTestList:(sqlTestList *)deletList;//刪除數據:
- (NSMutableArray*)searchTestList:(NSString*)searchString;//查詢資料庫,searchID為要查詢數據的ID,返回數據為查詢到的數據
@end

@interface sqlTestList : NSObject//重新定義了一個類,專門用於存儲數據
{
int sqlID;
NSString *sqlText;
NSString *sqlname;
}

@property (nonatomic) int sqlID;
@property (nonatomic, retain) NSString *sqlText;
@property (nonatomic, retain) NSString *sqlname;

@end

再來看看.m文件

//
// sqlService.m
// SQLite3Test
//
// Created by fengxiao on 11-11-28.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "sqlService.h"

@implementation sqlService

@synthesize _database;

- (id)init
{
return self;
}

- (void)dealloc
{
[super dealloc];
}

//獲取document目錄並返回資料庫目錄
- (NSString *)dataFilePath{

NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"=======%@",documentsDirectory);
return [documentsDirectory :@"data.db"];//這里很神奇,可以定義成任何類型的文件,也可以不定義成.db文件,任何格式都行,定義成.sb文件都行,達到了很好的數據隱秘性

}

//創建,打開資料庫
- (BOOL)openDB {

//獲取資料庫路徑
NSString *path = [self dataFilePath];
//文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//判斷資料庫是否存在
BOOL find = [fileManager fileExistsAtPath:path];

//如果資料庫存在,則用sqlite3_open直接打開(不要擔心,如果資料庫不存在sqlite3_open會自動創建)
if (find) {

NSLog(@"Database file have already existed.");

//打開資料庫,這里的[path UTF8String]是將NSString轉換為C字元串,因為SQLite3是採用可移植的C(而不是
//Objective-C)編寫的,它不知道什麼是NSString.
if(sqlite3_open([path UTF8String], &_database) != SQLITE_OK) {

//如果打開資料庫失敗則關閉資料庫
sqlite3_close(self._database);
NSLog(@"Error: open database file.");
return NO;
}

//創建一個新表
[self createTestList:self._database];

return YES;
}
//如果發現資料庫不存在則利用sqlite3_open創建資料庫(上面已經提到過),與上面相同,路徑要轉換為C字元串
if(sqlite3_open([path UTF8String], &_database) == SQLITE_OK) {

//創建一個新表
[self createTestList:self._database];
return YES;
} else {
//如果創建並打開資料庫失敗則關閉資料庫
sqlite3_close(self._database);
NSLog(@"Error: open database file.");
return NO;
}
return NO;
}

//創建表
- (BOOL) createTestList:(sqlite3*)db {

//這句是大家熟悉的SQL語句
char *sql = "create table if not exists testTable(ID INTEGER PRIMARY KEY AUTOINCREMENT, testID int,testValue text,testName text)";// testID是列名,int 是數據類型,testValue是列名,text是數據類型,是字元串類型

sqlite3_stmt *statement;
//sqlite3_prepare_v2 介面把一條SQL語句解析到statement結構里去. 使用該介面訪問資料庫是當前比較好的的一種方法
NSInteger sqlReturn = sqlite3_prepare_v2(_database, sql, -1, &statement, nil);
//第一個參數跟前面一樣,是個sqlite3 * 類型變數,
//第二個參數是一個 sql 語句。
//第三個參數我寫的是-1,這個參數含義是前面 sql 語句的長度。如果小於0,sqlite會自動計算它的長度(把sql語句當成以\0結尾的字元串)。
//第四個參數是sqlite3_stmt 的指針的指針。解析以後的sql語句就放在這個結構里。
//第五個參數是錯誤信息提示,一般不用,為nil就可以了。
//如果這個函數執行成功(返回值是 SQLITE_OK 且 statement 不為NULL ),那麼下面就可以開始插入二進制數據。

//如果SQL語句解析出錯的話程序返回
if(sqlReturn != SQLITE_OK) {
NSLog(@"Error: failed to prepare statement:create test table");
return NO;
}

//執行SQL語句
int success = sqlite3_step(statement);
//釋放sqlite3_stmt
sqlite3_finalize(statement);

//執行SQL語句失敗
if ( success != SQLITE_DONE) {
NSLog(@"Error: failed to dehydrate:create table test");
return NO;
}
NSLog(@"Create table 'testTable' successed.");
return YES;
}

//插入數據
-(BOOL) insertTestList:(sqlTestList *)insertList {

//先判斷資料庫是否打開
if ([self openDB]) {

sqlite3_stmt *statement;

//這個 sql 語句特別之處在於 values 裡面有個? 號。在sqlite3_prepare函數里,?號表示一個未定的值,它的值等下才插入。
static char *sql = "INSERT INTO testTable(testID, testValue,testName) VALUES(?, ?, ?)";

int success2 = sqlite3_prepare_v2(_database, sql, -1, &statement, NULL);
if (success2 != SQLITE_OK) {
NSLog(@"Error: failed to insert:testTable");
sqlite3_close(_database);
return NO;
}

//這里的數字1,2,3代表上面的第幾個問號,這里將三個值綁定到三個綁定變數
sqlite3_bind_int(statement, 1, insertList.sqlID);
sqlite3_bind_text(statement, 2, [insertList.sqlText UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 3, [insertList.sqlname UTF8String], -1, SQLITE_TRANSIENT);

//執行插入語句
success2 = sqlite3_step(statement);
//釋放statement
sqlite3_finalize(statement);

//如果插入失敗
if (success2 == SQLITE_ERROR) {
NSLog(@"Error: failed to insert into the database with message.");
//關閉資料庫
sqlite3_close(_database);
return NO;
}
//關閉資料庫
sqlite3_close(_database);
return YES;
}
return NO;
}

//獲取數據
- (NSMutableArray*)getTestList{

NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
//判斷資料庫是否打開
if ([self openDB]) {

sqlite3_stmt *statement = nil;
//sql語句
char *sql = "SELECT testID, testValue ,testName FROM testTable";//從testTable這個表中獲取 testID, testValue ,testName,若獲取全部的話可以用*代替testID, testValue ,testName。

if (sqlite3_prepare_v2(_database, sql, -1, &statement, NULL) != SQLITE_OK) {
NSLog(@"Error: failed to prepare statement with message:get testValue.");
return NO;
}
else {
//查詢結果集中一條一條的遍歷所有的記錄,這里的數字對應的是列值,注意這里的列值,跟上面sqlite3_bind_text綁定的列值不一樣!一定要分開,不然會crash,只有這一處的列號不同,注意!
while (sqlite3_step(statement) == SQLITE_ROW) {
sqlTestList* sqlList = [[sqlTestList alloc] init] ;
sqlList.sqlID = sqlite3_column_int(statement,0);
char* strText = (char*)sqlite3_column_text(statement, 1);
sqlList.sqlText = [NSString stringWithUTF8String:strText];
char *strName = (char*)sqlite3_column_text(statement, 2);
sqlList.sqlname = [NSString stringWithUTF8String:strName];
[array addObject:sqlList];
[sqlList release];
}
}
sqlite3_finalize(statement);
sqlite3_close(_database);
}

return [array retain];//定義了自動釋放的NSArray,這樣不是個好辦法,會造成內存泄露,建議大家定義局部的數組,再賦給屬性變數。
}

//更新數據
-(BOOL) updateTestList:(sqlTestList *)updateList{

if ([self openDB]) {
sqlite3_stmt *statement;//這相當一個容器,放轉化OK的sql語句
//組織SQL語句
char *sql = "update testTable set testValue = ? and testName = ? WHERE testID = ?";

//將SQL語句放入sqlite3_stmt中
int success = sqlite3_prepare_v2(_database, sql, -1, &statement, NULL);
if (success != SQLITE_OK) {
NSLog(@"Error: failed to update:testTable");
sqlite3_close(_database);
return NO;
}

附上出處鏈接:http://www.cnblogs.com/xiaozhu/archive/2012/12/07/2808170.html

『柒』 訪問SQlite資料庫的ios程序製作

現在如果使用SQLite話就用coreData。你那個功能就是做個分頁,跟資料庫的存儲沒有關系。別把數據Data存儲在資料庫中,這樣會使資料庫變的很大,並且讀取很不方便。把地址或者網址存儲下來,然後顯示出來就是了。