iOS SQL数据库操作

经典SQL语句大全:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html

 

1.常用语句

***SQL语句的预编译:将语句转为数据流,执行语句前检查语句的语法,但不能知道语句是否能查出结果。此方法有返回值  预编译成功则返回SQLITE_OK----0否则返回SQLITE_ERROR----1
int sqlite3_prepare_v2(
  sqlite3 *db,                 //指向数据库的指针
  const char *zSql,         //SQL语句
  int nByte,                   //SQL语句的长度 (一般用-1,系统可以自动算出字符串得长度)
  sqlite3_stmt **ppStmt, //指向语句的指针
  const char **pzTail       //SQL中没有用到的一部分,一般为空
);
***SQL语句的值绑定。
*此类方法均有返回值  预编译成功则返回SQLITE_OK----0否则返回SQLITE_ERROR----1
//对整数值的绑定
int sqlite3_bind_int(
sqlite3_stmt*,            //指向语句的指针
int,                      //占位符的序号(从1开始以此类推)
int                       //绑定的值
);
//对字符串值的绑定
int sqlite3_bind_text(
sqlite3_stmt*,            //指向语句的指针
int,                      //占位符的序号(从1开始以此类推)
const char*,              //要绑定的值(这里要c类型的字符串(CString),一般我们使用的是oc的字符串(NSString*)要通过- (__strong const char *)UTF8String转一下就可以了)
int n,                    //该字符串的长度(一般用-1,系统可以自动算出字符串得长度)
void(*)(void*)            //回调函数(这里博主还没用过所以不是很了解以后会慢慢更新)
);
//对二进制数据值的绑定
int sqlite3_bind_blob(
sqlite3_stmt*,            //指向语句的指针
int,                      //占位符的序号(从1开始以此类推)
const void*,              //要绑定的值(这里要的是c类型的比特(Byte),一般我们使用的是oc的NSDATA(NsData*)要通过- (const void *)bytes转一下就可以了)
int n,                    //数据的长度(用- (NSUInteger)length得到  这里为什么不用-1呢?因为-1对于算字符串长度在行,其他的不一定准所以这里我们手动算出数据的长度)
void(*)(void*)            //回调函数(这里博主还没用过所以不是很了解以后会慢慢更新)
);
***SQL语句的取值(从数据库中对每一列取值)
//对整数字段的取值
int sqlite3_column_int(
sqlite3_stmt*,            //指向语句的指针
int iCol                  //数据库中表中列的序号(从0开始以此类推)
);
//对字符串字段的取值
*注意这里我们取得是无符号的c字符串我们要先转为有符号C字符串再转为OC字符串
例sname为oc字符串
NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];

const unsigned char *sqlite3_column_text(
sqlite3_stmt*,            //指向语句的指针
int iCol                  //数据库中表中列的序号(从0开始以此类推)
);
//对二进制字段的取值
*注意这里我们取得是c二进制我们要转为oc二进制(我们要将byte(c)转为nsdata(oc)通过+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;因为这里需要数据的长度所以需要调用int sqlite3_column_bytes(sqlite3_stmt*, int iCol);获取数据的长度)

int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
 
const void *sqlite3_column_blob(
sqlite3_stmt*,            //指向语句的指针
int iCol                  //数据库中表中列的序号(从0开始以此类推)
);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
******************************************新建一个类(Student*)
包含以下属性
@property(retain,nonatomic)NSString*sname;
@property(assign,nonatomic)int sage;
@property(retain,nonatomic)NSData*simage;
@property(assign,nonatomic)int sid;
1.数据库的全表查询
+(NSMutableArray*) findall//返回表中所有记录
{
    NSMutableArray* stuArray;//存储查询结果  在这里只声明不开辟空间 等用的时候再开辟(节省空间)
    sqlite3 *sqlite=[DataBase OpenDB];//打开数据库  并且定义了一个指针sqlite指向dbpoint所指向的区域(数据库)
    sqlite3_stmt *stmt=nil;//定义一个指向sql语句的指针对象
    int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象  sqlite:数据库 -1:系统自动算出要存的sql语句的长度(也可以自己给出) &stmt:一个指向sql语句的内存的地址  nil:sql语句中没有用到的一部分(一般为空) 返回值为一个int(宏)SQLITE_OK 0  SQLITE_ERROR 1
    if (flag==SQLITE_OK) //预编译成功
    {
        stuArray=[[NSMutableArray alloc]init];//为数组开辟空间
        while (sqlite3_step(stmt)==SQLITE_ROW) //开始指向第一行的上面 判断下一行是否存在(存在:做准备指针移到下一行)(不存在:跳出循环)
        {
            int sid1=sqlite3_column_int(stmt, 0);//获取表中当前行第一列的值
            int sage=sqlite3_column_int(stmt, 2);
            NSString *sname1=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//获取当前表中当前行第二列的值
            //sqlite3_column_text(stmt, 1):返回的是一个无符号c字符串  (const char *)进行强转为有符号c字符串  stringWithUTF8String:将一个c字符串转为nsstring类型
            int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长度 sqlite3_column_bytes():获取当前行某一列的所占内存的字节数
            NSData *img1=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
            //sqlite3_column_blob(stmt, 2):返回的是byte型(c) dataWithBytes:length:将(c)二进制转为nsdata(oc)

            //定义一个(Student*)对象并将从数据库取来的数据赋值给对象的相应属性
            Student *stu=[[Student alloc]init];//实例化
            stu.sid=sid1;
            stu.sname=sname1;
            stu.simage=img1;
            stu.sage=sage;
            [stuArray addObject:stu];//将一个对象存入数组
            [stu release];//释放对象
        }
    }
    sqlite3_finalize(stmt);//回收stmt对象
    return [stuArray autorelease];//返回包含学生信息的数组  并设为自动释放
}
2.通过姓名或者学号查询
*注意这里学号是主键所以肯定查回来是有唯一确定的(Student*)对象
+(Student*) findbysid:(int) sid
{
    Student *stu;//用于返回的学生对象
    sqlite3 *sqlite=[DataBase OpenDB];//打开数据库
    sqlite3_stmt *stmt=nil;//定义sql语句对象
    int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_int(stmt, 1, sid);//给问号占位符赋值
        while (sqlite3_step(stmt)==SQLITE_ROW)//因为一个学号肯定对应一个学生所以这里其实只执行一次
        {
            //根据列顺序(从零开始)
            int sid=sqlite3_column_int(stmt, 0);//取整型数据
            int sage=sqlite3_column_int(stmt, 2);
            NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring数据
            int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
            NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象
            //将从数据库中查询来的数据存到(Student*)对象中,用于返回 
            stu=[[Student alloc]init];//此时开辟空间节省内存
            stu.sid=sid;
            stu.sname=sname;
            stu.simage=img;
            stu.sage=sage;
        }
    }
    sqlite3_finalize(stmt);//回收stmt对象
    return [stu autorelease];//返回包含学生信息的对象
}
*注意这里一般学生姓名并不是唯一标示所以可能会查到多条记录符合条件所以要返回一个数组来存储符合条件的(Student*)对象  但现在我们的数据库不涉及重名的事例所以这里只返回学生对象
+(Student*) findbysname:(NSString*)sname
{
    Student *stu;//用于返回的学生对象
    sqlite3 *sqlite=[DataBase OpenDB];//打开数据库
    sqlite3_stmt *stmt=nil;//定义sql语句对象
    int flag=sqlite3_prepare_v2(sqlite, "select * from tblstudent where stuname=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [sname UTF8String], -1, nil);//给问号占位符赋值
        while (sqlite3_step(stmt)==SQLITE_ROW)
        {
            //根据列顺序(从零开始)
            int sid=sqlite3_column_int(stmt, 0);//取整型数据
            int sage=sqlite3_column_int(stmt, 2);
            NSString *sname=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];//取nsstring数据
            int length=sqlite3_column_bytes(stmt,3);//获取二进制数据的长度
            NSData *img=[NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:length]; //将二进制数据转换位NSData对象 
            stu=[[Student alloc]init];//此时开辟空间节省内存
            stu.sid=sid;
            stu.sname=sname;
            stu.simage=img;
            stu.sage=sage;
        }
    }
    sqlite3_finalize(stmt);//回收stmt对象
    return [stu autorelease];//返回包含学生信息的(Student*)对象
}
3.向数据库增加一条记录
+(void) insertstudent:(NSString*) name age:(int)age image:(NSData*)image
{
    sqlite3 *sqlite=[DataBase OpenDB];//打开数据库
    sqlite3_stmt *stmt=nil;//定义sql语句对象
    int flag=sqlite3_prepare_v2(sqlite, "insert into tblstudent(stuname,stuage,stuimage) values(?,?,?)", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象  多值绑定逗号隔开
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [name UTF8String],-1,nil);//给问号占位符赋值
        sqlite3_bind_int(stmt, 2, age);//对整型数据的绑定
        sqlite3_bind_blob(stmt, 3, [image bytes], [image length], nil);//对二进制类型数据的绑定 数据的字节数(-1 针对字符串的长度比较准)
        if(sqlite3_step(stmt)==SQLITE_ERROR)//执行insert动作
        {
            NSLog(@"insert error");
        }
    }
    sqlite3_finalize(stmt);//回收stmt对象
}
4.修改更新数据库的数据
*注意更新数据库时要通过一定的限制条件来确定要更新的记录,可能是一条也可能是多条,当要更新的记录是多条时要注意所有符合条件的记录都会改为你定义的值。
+(void) updatestudent:(Student*) stu
{
    sqlite3 *sqlite=[DataBase OpenDB];//打开数据库
    sqlite3_stmt *stmt=nil;//定义sql语句对象
    int flag=sqlite3_prepare_v2(sqlite, "update tblstudent set stuname=?,stuage=?,stuimage=? where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [stu.sname UTF8String],-1,nil);//给问号占位符赋值
        //stu.sname为nsstring    UTF8String    nsstring---->ctring
        sqlite3_bind_int(stmt, 4, stu.sid);//给问号占位符赋值
        sqlite3_bind_int(stmt, 2, stu.sage);//给年龄赋值
        sqlite3_bind_blob(stmt, 3, [stu.simage bytes], [stu.simage length], nil);
        if(sqlite3_step(stmt)==SQLITE_ERROR)//执行update动作
        {
            NSLog(@"update error");
        }
        sqlite3_finalize(stmt);//回收stmt对象
    }
}
5.删除数据库的记录
*注意删除数据库的记录时要通过一定的限制条件来确定要删除的记录,可能是一条也可能是多条,当要删除的记录是多条时要注意所有符合条件的记录都会被删除。
+(void) deletebysid:(int) sid
{
    sqlite3 *sqlite=[DataBase OpenDB];//打开数据库
    sqlite3_stmt *stmt=nil;//定义sql语句对象
    int flag=sqlite3_prepare_v2(sqlite, "delete from tblstudent where stuid=?", -1, &stmt, nil);//调用预处理函数将sql语句赋值给stmt对象
    if (flag==SQLITE_OK)
    {
        sqlite3_bind_int(stmt, 1, sid);//给问号占位符赋值  1.语句2.占位符的序号3.给占位符赋得值
        //执行delete动作
        if(sqlite3_step(stmt)==SQLITE_ERROR)//未执行成功
        {
            NSLog(@"delete error");
        }
    }
    sqlite3_finalize(stmt);//回收stmt对象
   
    NSLog(@"删除了第%d",sid);
}

转载于:https://www.cnblogs.com/jy578154186/archive/2012/10/18/2730113.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Xamarin是一个开发跨平台移动应用的框架,可以使用C#编写代码,并在各个主流操作系统上运行。通过使用Xamarin,我们可以通过Web服务操作SQL Server数据库。 首先,我们需要创建一个Web服务,它可以作为中间层将Xamarin客户端和SQL Server数据库连接起来。可以使用C#或ASP.NET等技术创建这个Web服务。Web服务可以使用SQL Server的数据访问技术,比如ADO.NET来进行数据库操作。 接下来,我们需要在Xamarin应用程序中引用这个Web服务。在Xamarin中,可以使用HttpClient或HttpWebRequest进行网络请求,通过调用Web服务的接口来与数据库进行通信。可以使用SOAP协议或RESTful风格的Web API来定义和实现这些接口。 在Xamarin应用程序中,我们可以创建一个数据访问层,用于处理与Web服务的通信和数据交互。我们可以封装所有与Web服务相关的细节,包括请求参数的封装、发送和接收请求、处理响应数据等。通过调用数据访问层的方法,我们可以实现从数据库中查询、插入、更新或删除数据。 在Xamarin应用程序的UI层,我们可以根据需要设计并实现各种界面,用于展示数据库中的数据或接收用户输入。我们可以通过与数据访问层的交互来获取或更新数据库中的数据,并将其显示在界面上,或者将用户输入的数据传递给数据访问层进行数据库操作。 总之,通过使用Xamarin和Web服务,我们可以方便地在移动应用中与SQL Server数据库进行交互。通过将数据访问层封装,我们可以更好地管理和维护数据库操作的代码,提高开发效率和代码质量。同时,Xamarin的跨平台特性也使得我们可以将这一功能应用于多个操作系统的移动设备上。 ### 回答2: Xamarin是一款跨平台的移动应用开发框架,通过使用C#语言和.NET平台来实现移动应用程序的开发。而Web Service是一种能够使用标准的HTTP协议进行通信的应用程序编程接口(API),它允许不同的应用程序之间进行数据交换。 在Xamarin应用程序中操作SQL Server数据库可以通过使用WebService来实现。首先,我们需要在服务器上创建一个WebService,这个WebService将提供一组用于操作SQL Server数据库的方法。这些方法可以包括查询、插入、删除和更新数据操作。 在Xamarin应用程序中,我们可以使用HttpClient或HttpWebRequest类来发送HTTP请求并接收WebService的响应。我们可以调用WebService中的方法来执行数据库操作,例如查询特定数据表中的数据或往数据库中插入新的数据等。通过将WebService的URL地址传递给HttpClient或HttpWebRequest类,我们可以在Xamarin应用程序中与WebService进行通信。 在使用WebService进行数据库操作时,我们需要确保WebService的安全性。可以使用HTTPS协议来确保数据的安全传输。另外,我们还可以使用Web服务身份验证来确保只有经过身份验证的用户才能访问并执行数据库操作。 总结来说,通过使用Xamarin中的HttpClient或HttpWebRequest类和WebService,我们可以在移动应用程序中操作SQL Server数据库。这样可以实现数据的查询、插入、删除和更新等操作,并确保数据的安全传输和访问控制。 ### 回答3: Xamarin是一个跨平台的移动应用开发框架,它可以用于创建适用于Android和iOS平台的应用程序。通过使用Xamarin,可以通过WebService对SQL Server数据库进行操作。 WebService是一种基于标准Web协议的应用程序编程接口(API),它可以通过HTTP进行通信,并使用XML格式来传递数据。为了在Xamarin应用中使用WebService来操作SQL Server数据库,首先需要创建一个适当的WebService。 在SQL Server数据库中,可以使用ASP.NET或其他编程语言(如C#)来创建WebService。WebService可以提供一系列方法或函数,用于执行数据库操作,例如查询数据、插入、更新和删除记录等。 在Xamarin应用中,可以使用HttpClient来调用WebService的方法。通过HttpClient,可以发送HTTP请求到WebService的URL,并接收响应。使用WebService提供的方法,可以向SQL Server数据库发送SQL查询,并获取结果。 例如,可以在Xamarin应用中创建一个按钮,当用户点击该按钮时,调用WebService的方法来查询某个表中的记录。在点击事件处理程序中,使用HttpClient发送HTTP请求到WebService的URL,并传递相应的参数。WebService接收到请求后,执行SQL查询并返回结果。在Xamarin应用中,可以解析WebService返回的结果,并将其展示给用户。 总结而言,通过使用Xamarin和WebService,可以实现对SQL Server数据库操作。WebService提供了一种标准的接口,用于在Xamarin应用中执行数据库操作。通过发送HTTP请求和解析响应,可以实现数据的查询和更新等常用操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值