当前位置:首页 » 数据仓库 » 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存储在数据库中,这样会使数据库变的很大,并且读取很不方便。把地址或者网址存储下来,然后显示出来就是了。