[iPhone-Sqlite3]如何为项目添加一个SqliteHelper,打开,插入,查询等
- ** 调用sqlite3_prepare()将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt).该结构体中包含了将要执行的的SQL语句的信息.
** 如果需要传入参数,在SQL语句中用'?'作为占位符,再调用sqlite3_bind_XXX()函数将对应的参数传入.
** 调用sqlite3_step(),这时候SQL语句才真正执行.注意该函数的返回值,SQLITE_DONE和SQLITE_ROW都是表示执行成功, 不同的是SQLITE_DONE表示没有查询结果,象UPDATE,INSERT这些SQL语句都是返回SQLITE_DONE,SELECT查询语句在 查询结果不为空的时候返回SQLITE_ROW,在查询结果为空的时候返回SQLITE_DONE.
** 每次调用sqlite3_step()的时候,只返回一行数据,使用sqlite3_column_XXX()函数来取出这些数据.要取出全部的数据需要 反复调用sqlite3_step(). (注意, 在bind参数的时候,参数列表的index从1开始,而取出数据的时候,列的index是从0开始).
** 在SQL语句使用完了之后要调用sqlite3_finalize()来释放stmt占用的内存.该内存是在sqlite3_prepare()时分配的.
** 如果SQL语句要重复使用,可以调用sqlite3_reset()来清楚已经绑定的参数.
下面是我的打算的函数调用方式。引用的SqliteHelper之后,里面的方法可以直接调用。
[SqliteHelper open];
catArray = [[NSMutableArray alloc] init];
[SqliteHelper GetAllCat:catArray];
self.DataArray = catArray;
[catArray release];
.h文件中的定义部分。
#import "SqliteHelper.h"
static sqlite3 *database_ = nil;
@implementation SqliteHelper
@synthesize databaseName;
@synthesize databasePath;
+可以理解为Static函数的写法把。
open函数不用太多介绍。上一篇里面有详细的讲解。
+(BOOL) open{
databaseName = @"mydatabase.sqlite";
// Get the path to the documents directory and append the databaseName
NSString *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:databaseName];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL find = [fileManager fileExistsAtPath:path];
if (find) {
NSLog(@"Database file have already existed.");
if(sqlite3_open([path UTF8String], &database_) != SQLITE_OK) {
sqlite3_close(database_);
NSLog(@"Error: open database file.");
return NO;
}
return YES;
}
else {
sqlite3_close(database_);
NSLog(@"Error: open database file.");
return NO;
}
return NO;
}
这个SelectAll的一个方法。 不过目前看来还是不够抽象。因为就目前来看,还是具体问题需要具体分析的, 比如不同的结构,目前还无法查询到一个不同的结果,这是不可以通用的,至少表格的存储数据类型,和顺序的不同,是有很大的差异的。 还是有很大需要完善的地方把。目前也只是提供一个思路给大家参考。功能实现的同时,不要把这门OO的语言抛在脑后,时常想起面向对象。。面向对象。。。
+(void)GetAllCat:(NSMutableArray*)catRet withSQL:(char *)sql
{
//[self checkAndCreateDatabase:databasePath withname:databaseName];
sqlite3_stmt *statement = nil;
if(sqlite3_open([databasePath UTF8String], &database_) == SQLITE_OK)
{
//sql = "SELECT * FROM SubCat";
int test = sqlite3_prepare_v2(database_, sql, -1, &statement, NULL);
if (sqlite3_prepare_v2(database_, sql, -1, &statement, NULL) != SQLITE_OK)
{
NSLog(@"Error: failed to prepare statement with message:get channels.");
}
while (sqlite3_step(statement) == SQLITE_ROW)
{
NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
NSString *catID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
int catid2 = [catID intValue];
int catid = sqlite3_column_int(statement, 0);
cat* cattable = [[cat alloc] init];
cattable.catId = catid;
if(aName)
{
cattable.catname = aName;
}
[catRet addObject:cattable];
[cattable release];
}
}
sqlite3_finalize(statement);
}
http://alexliu.cnblogs.com
参考文章:http://blog.csdn.net/mawl2002
作者:Alexliu(alex dotNet Learning)
出处:http://alexliu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,转载请注明。并且保留文章链接。否则保留追究法律责任的权利。