首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >插入后Sqlite select返回1行

插入后Sqlite select返回1行
EN

Stack Overflow用户
提问于 2016-01-11 03:36:39
回答 1查看 192关注 0票数 0

我在select from sql之后遇到了一个问题。我向updateRow发送了一个包含5个对象的NSArray。在更新之后(我做了5次addRow),我在getGroupsByUserId上只得到了其中的一个。

下面是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+(BOOL)createUserTable:(sqlite3*)database{
    char* errormsg;

NSString* sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (%@ TEXT PRIMARY KEY, %@ TEXT)",USER_GROUPS_TABLE,USER_ID,GROUP_ID];
int res = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errormsg);
if(res != SQLITE_OK){
    NSLog(@"ERROR: failed creating USERS-GROUPS table");
    return NO;
}
return YES;
}

+(void)updateRow:(sqlite3*)database rowToUpdate:(NSArray*)rowToUpdate{
    for (UserGroup* ug in rowToUpdate) {
        [UsersGroupsRelationShipSql addRow:database userId:ug.userId groupId:ug.groupId ];
        NSLog(@"update Row %@ %@", ug.userId, ug.groupId);
    }
}

+(void)addRow:(sqlite3*)database userId:(NSString*)userId groupId:(NSString*)groupId{
    NSLog(@"addRow: '%@', '%@'", userId, groupId);
    sqlite3_stmt *statment;
    NSString* query = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ (%@,%@) values (?,?);",USER_GROUPS_TABLE,USER_ID,GROUP_ID];

    if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statment,nil) == SQLITE_OK){
        sqlite3_bind_text(statment, 1, [userId UTF8String],-1,NULL);
        sqlite3_bind_text(statment, 2, [groupId UTF8String],-1,NULL);
        if(sqlite3_step(statment) == SQLITE_DONE){
            sqlite3_finalize(statment);
            return;
        }
    }
    sqlite3_finalize(statment);
    NSLog(@"ERROR: addRowToTable failed %s",sqlite3_errmsg(database));
}



+(NSMutableArray*)getGroupsByUserId:(sqlite3*)database userId:(NSString*)userId{
    NSLog(@"getGroupsByUserId: '%@'", userId);
    NSMutableArray* data = [[NSMutableArray alloc] init];
    sqlite3_stmt *statment;
    NSString* query = [NSString stringWithFormat:@"SELECT * from USERS_GROUPS WHERE %@ = %@;", USER_ID,userId];

    if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statment,nil) == SQLITE_OK){
        while(sqlite3_step(statment) == SQLITE_ROW){
            NSString* usId = [NSString stringWithFormat:@"%s",sqlite3_column_text(statment,0)];
            NSString* grId = [NSString stringWithFormat:@"%s",sqlite3_column_text(statment,1)];
            NSLog(@" row: '%@', '%@'", usId, grId);
            UserGroup* ug = [[UserGroup alloc] init:usId groupId:grId];
            [data addObject:ug];
        }
    }
    else{
        NSLog(@"ERROR: getGroupsByUserId failed %s",sqlite3_errmsg(database));
        sqlite3_finalize(statment);
        return nil;
    }
    sqlite3_finalize(statment);
    return data;
}

调试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2016-01-13 11:30:11.901 MaverickApp[7196:142637] userId Logged = 1
2016-01-13 11:30:11.919 MaverickApp[7196:142637] Groups tab was loaded
2016-01-13 11:30:11.920 MaverickApp[7196:142675] getGroupsByUserId: userId = 1 from Sql
2016-01-13 11:30:11.922 MaverickApp[7196:142675]  get row: userId = 1, groupId = 2  from Sql
2016-01-13 11:30:11.927 MaverickApp[7196:142675] Returned groupsByUser from parse from date 2016-01-13 09:24:11 +0000
2016-01-13 11:30:11.931 MaverickApp[7196:142637] Groups tab was loaded
2016-01-13 11:30:11.932 MaverickApp[7196:142684] getGroupsByUserId: userId = 1 from Sql
2016-01-13 11:30:11.935 MaverickApp[7196:142684]  get row: userId = 1, groupId = 2  from Sql
2016-01-13 11:30:11.937 MaverickApp[7196:142684] Returned groupsByUser from parse from date 2016-01-13 09:24:11 +0000
2016-01-13 11:30:12.121 MaverickApp[7196:142675] Returned row: groupId 1 userId 6
2016-01-13 11:30:12.121 MaverickApp[7196:142675] Returned 1 groups for userId = 1 from parse
2016-01-13 11:30:12.122 MaverickApp[7196:142675] data 1
2016-01-13 11:30:12.122 MaverickApp[7196:142675] update Row: userId = 1 groupId = 6 in Sql
2016-01-13 11:30:12.123 MaverickApp[7196:142675] add Row: userId = 1 groupId = 6 in Sql
2016-01-13 11:30:12.127 MaverickApp[7196:142675] addRow done
2016-01-13 11:30:12.128 MaverickApp[7196:142675] getGroupsByUserId: userId = 1 from Sql
2016-01-13 11:30:12.129 MaverickApp[7196:142675]  get row: userId = 1, groupId = 6  from Sql
2016-01-13 11:30:12.129 MaverickApp[7196:142675] Group id number 6 for userId 1
2016-01-13 11:30:12.142 MaverickApp[7196:142675] getGroup: groupId = 6 from Sql
2016-01-13 11:30:12.143 MaverickApp[7196:142675] getGroup: groupId = 6  from Sql
2016-01-13 11:30:12.145 MaverickApp[7196:142675] Returned groups from parse from date 2016-01-13 09:24:14 +0000
2016-01-13 11:30:12.504 MaverickApp[7196:142684] Returned row: groupId 1 userId 6
2016-01-13 11:30:12.505 MaverickApp[7196:142684] Returned 1 groups for userId = 1 from parse
2016-01-13 11:30:12.505 MaverickApp[7196:142684] data 1
2016-01-13 11:30:12.506 MaverickApp[7196:142684] update Row: userId = 1 groupId = 6 in Sql
2016-01-13 11:30:12.506 MaverickApp[7196:142684] add Row: userId = 1 groupId = 6 in Sql
2016-01-13 11:30:12.509 MaverickApp[7196:142684] addRow done
2016-01-13 11:30:12.511 MaverickApp[7196:142684] getGroupsByUserId: userId = 1 from Sql
2016-01-13 11:30:12.511 MaverickApp[7196:142684]  get row: userId = 1, groupId = 6  from Sql
2016-01-13 11:30:12.512 MaverickApp[7196:142684] Group id number 6 for userId 1
2016-01-13 11:30:12.512 MaverickApp[7196:142684] getGroup: groupId = 6 from Sql
2016-01-13 11:30:12.512 MaverickApp[7196:142684] getGroup: groupId = 6  from Sql
2016-01-13 11:30:12.513 MaverickApp[7196:142684] Returned groups from parse from date 2016-01-13 09:24:14 +0000
2016-01-13 11:30:12.824 MaverickApp[7196:142675] Returned 3 groups from parse
2016-01-13 11:30:12.825 MaverickApp[7196:142675] addGroup: groupId = 2 in Sql
2016-01-13 11:30:12.828 MaverickApp[7196:142675] addGroup done
2016-01-13 11:30:12.828 MaverickApp[7196:142675] addGroup: groupId = 6 in Sql
2016-01-13 11:30:12.830 MaverickApp[7196:142675] addGroup done
2016-01-13 11:30:12.830 MaverickApp[7196:142675] addGroup: groupId = 8 in Sql
2016-01-13 11:30:12.832 MaverickApp[7196:142675] addGroup done
2016-01-13 11:30:12.833 MaverickApp[7196:142675] getGroup: groupId = 6 from Sql
2016-01-13 11:30:12.834 MaverickApp[7196:142675] getGroup: groupId = 6  from Sql
2016-01-13 11:30:13.138 MaverickApp[7196:142684] Returned 3 groups from parse
2016-01-13 11:30:13.138 MaverickApp[7196:142684] addGroup: groupId = 2 in Sql
2016-01-13 11:30:13.142 MaverickApp[7196:142684] addGroup done
2016-01-13 11:30:13.142 MaverickApp[7196:142684] addGroup: groupId = 6 in Sql
2016-01-13 11:30:13.144 MaverickApp[7196:142684] addGroup done
2016-01-13 11:30:13.144 MaverickApp[7196:142684] addGroup: groupId = 8 in Sql
2016-01-13 11:30:13.145 MaverickApp[7196:142684] addGroup done
2016-01-13 11:30:13.146 MaverickApp[7196:142684] getGroup: groupId = 6 from Sql
2016-01-13 11:30:13.147 MaverickApp[7196:142684] getGroup: groupId = 6  from Sql
EN

回答 1

Stack Overflow用户

发布于 2016-01-11 05:20:04

有几个问题:

  1. 您正在使用INSERT OR REPLACE。如果您的表的主键只是userid字段,那么您将看到所描述的行为。仔细检查此表的主键。

  1. 确保数据库不在捆绑包中,而是位于某个可更新的位置,如Documents文件夹等。

  1. 在你的原始getGroupsByUserId中,我根本看不出这是如何工作的,因为你没有使用?占位符,也没有在字符串文字两边使用引号。我本以为这会产生一个错误。

我建议对userId使用?占位符,然后在WHERE子句中对该值使用sqlite3_bind_text。但您现在更改了答案中的代码(没有告诉我们行为是否更改)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34713837

复制
相关文章
控制器操作
一.控制器操作 我们首先复习一下基本的控制器定义和方法执行方式。 第一步:控制器默认创建在当前模块下的 Controller 目录下; 第二步:按照指定的命名规则:控制器名(首字母大写)+Controller.class.php; 第三步:控制器里的方法必须是 public 公共的; //控制器 class UserController extends Controller { public function index() { //index()方法在URL访问时可以忽略 } } URL 访问:http://localhost/demo39/User/index/
PM吃瓜
2019/08/13
6470
控制器操作【2】
三.跳转和重定向 ThinkPHP 在操作数据库时,需要跳转和重定向页面。ThinkPHP 提供了一组方法来解决了这个问题。 //成功和失败的跳转 class UserController extends Controller { public function index() { $flag = true; if ($flag) { //会跳转到:http://localhost/demo39/User/all $this->success('新增成功!', '../User/all'); } else { //会跳转到本页的上一页 $this->error('新增失败!'); } } } PS:success()方法和 error()方法,第一个参数是提示信息、第二个跳转的地址、第三个跳转时间。默认情况下 success()方法是 1 秒,error()方法是 3 秒。
PM吃瓜
2019/08/13
5720
控制器操作【3】
五.请求类型 ThinkPHP 提供了一组常量来判断当前请求是否是 GET、POST 等。通过判断请求处理不同的业务逻辑。 常量 含义 IS_GET 判断是否 GET 提交请求 IS_POST 判断是否 POST 提交请求 IS_PUT 判断是否 PUT 提交请求 IS_DELTE 判断是否 DELETE 提交请求 IS_AJAX 判断是否 AJAX 提交请求 //判断是否GET请求 if (IS_GET) { echo '是GET请求'; } else { echo '不是GET请求'; }
PM吃瓜
2019/08/13
5680
SDRAM控制器操作时序
IDLE 状态到WRITE 状态: ​ 1) 在IDLE 状态需要先给ACT 命令激活某一行,此时处于Row Active 状态; ​ 2) 在Row Active 状态之后,给Write 命令则会进入WRITE 状态; ​ 3) 在WRITE 状态后,再给一次Write 命令,就可以继续写入数据。 WRITE 状态到IDLE 状态: ​ 1) 在WRITE 状态给PRE 命令,则SDRAM 将跳出WRITE 状态进入Precharge状态; ​ 2) 在Precharge 状态后,就会自动进入IDLE 状态了。
全栈程序员站长
2022/09/16
7090
SDRAM控制器操作时序
分区操作后索引的状态
导读:DDL操作是否会导致索引失效的原则上是看是否引起数据发生变化,如果分区的数据发生了改变,则索引需要失效才能保证结果的准确性,如果数据没有发生变化,则索引的状态不会变为UNUSABLE。
数据和云
2020/02/27
8260
Structured Streaming的任意状态操作
很多使用案例需要比聚合更高级的状态操作。例如,在很多案例中,你必须跟踪来自于事件数据流的会话操作。为了处理这种会话机制,必须存储任意类型的数据作为状态,同时每次触发使用数据流事件对状态做任意的状态操作。从spark2.2开始,可以使用mapGroupsWithState和更强大操作flatMapGroupsWithState。两个操作都允许你对分组的datasets使用自定义代码去更新自定义状态。
Spark学习技巧
2019/07/22
1.3K0
git版本控制器的相关操作
git status 查看仓库状态 git diff <filename> 查看为提交的修改 git log 查看提交的日志 git log --pretty=oneline 单行显示
java攻城狮
2020/10/10
5490
git版本控制器的相关操作
Spring中如何操作JDBC
本篇文章介绍一下在Spring中如何使用JDBC,事实上,在Spring中使用JDBC和传统的JDBC或者一些JDBC框架,如:DBUtils的使用没有什么区别,所以Spring中使用JDBC是非常简单的。
wangweijun
2020/02/14
3490
.Net中如何操作IIS
Net中实际上已经为我们在这方面做得很好了。FCL中提供了不少的类来帮助我们完成这项工作,让我们的开发工作变非常简单和快乐。编程控制IIS实际上很简单,和ASP一样,.Net中需要使用ADSI来操作IIS,但是此时我们不再需要GetObject这个东东了,因为.Net为我们提供了更加强大功能的新东东。 System.DirectoryServices命名空间中包括了些强大的东东--DirectoryEntry,DirectoryEntries,它们为我们提供了访问活动目录的强大功能,在这些类允许我们操作II
脑洞的蜂蜜
2018/02/02
1.9K0
JQuery中DOM操作示例代码
Jquery的DOM操作 1、插入节点代码示例: <p title=”选择你喜欢的水果”>你最喜欢的水果是?</p> <ul> <li title=”苹果”>苹果</li> <li title=”橘子”>橘子</li> <li title=”菠萝”>菠萝</li> </ul> <script language=”javascript”> var $li_1=$(“<li title=’香蕉’>香蕉</li>”); var $li_2=$(“<li title=’雪梨’>雪梨</li>”); $(“ul”).
苦咖啡
2018/05/07
1.3K0
VBA操作VBA——代码操作
有了前面VBA工程对象的基础,要操作代码就容易了,只要找到对象对应的属性、方法就可以。
xyj
2020/07/28
2.5K0
VBA操作VBA——代码操作
嵌入式中状态机的几种骚操作
状态机可以分为状态和事件 ,状态的跃迁都是受事件驱动的,因此可以通过一个二维表格来表示状态的跃迁。
混说Linux
2023/02/24
1K0
嵌入式中状态机的几种骚操作
【Ruby on Rails】Model中关于保存之前的原值和修改状态
今天在Rails的Model中遇到了一个问题—— 当我从Model类中获取了一个ActiveRecord对象,对其进行了一系列修改(尚未保存),我该如何确定究竟哪些修改了呢? (设Model为Option,相关的的参数为correct) 我本来采取的方法是——在数据表中新增一个ori_correct参数,每次对象保存之前都和correct做到同步,这样一来,是不是correct字段发生了修改也就得以判断了。 但是这样的缺点也显而易见——如果以后参数个数很多的话,岂不是得每一个都得来一个相应的ori_字段?这
HansBug
2018/04/11
1.7K0
Nightwatch中如何模拟键盘操作
在自动化测试中有这样一个场景,在一个输入框中输入一串字符,然后执行敲回车键,验证搜索结果,以Google搜索为例,代码如下:
Peter Shen
2020/06/12
1.3K0
Java中如何操作超大数
我们知道Integer的最大值是 2^31 - 1,Long最大值是 2^63 -1, 不管是32位机还是64位机都是这样, 通常来说我们要操作一个大于 Integer最大值的数的时候会用 Long来进行, 但万一我们遇到一个比 Long的最大值还大的数怎么办呢?
PhoenixZheng
2018/08/07
4290
Java中如何实现原子操作?
在Java中,J实现原子操作 可以通过锁和循环CAS的方式来实现原子操作。 1 使用循环CAS操作原子操作 package com.yy;
爱明依
2019/03/12
8590
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )
对集合使用 " + " 运算符 , 其作用相当于 调用 plus 方法 , " + " 符号两侧的值就是 plus 方法的
韩曙亮
2023/03/30
1.2K0
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )
点击加载更多

相似问题

Rails如何计算操作的响应代码

10

如何更改Swagger中成功操作的响应状态代码?

22

Rails控制器操作不响应更改

12

如何从rails控制器操作发出404响应?

71

单个Rails控制器操作中的多个JSON响应

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文