如何将 sqlite3 表分配给 nsarray

Posted

技术标签:

【中文标题】如何将 sqlite3 表分配给 nsarray【英文标题】:how to assign a sqlite3 table to nsarray 【发布时间】:2015-10-14 10:52:32 【问题描述】:

我正在开发一个聊天应用程序,因为我使用 sqlite 来存储和检索聊天历史记录,我可以插入值,但是在检索时我得到数组中的 nil 这是我的代码

messageArray=[DBObject AllRowFromTableName:@"chatTable" withUserID:myJID withFriendID:chatWithUser];


for (int i=0; i<[messageArray count]; i++) 

    Message *msg=[[Message alloc] init];
          msg.text=[[messageArray objectAtIndex:i] msg];
    if ([[messageArray objectAtIndex:i] lft_rght]==0) 
        msg.fromMe=YES;
    
    else
        msg.fromMe=NO;
    

    msg.type=SOMessageTypeText;

    NSString *dateString =[[messageArray objectAtIndex:i] tim_dte];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm,yyyy/MM/dd"];
    NSDate *dateFromString = [[NSDate alloc] init];
    dateFromString = [dateFormatter dateFromString:dateString];
    msg.date=dateFromString;

    [self.chatHistoryArray addObject:msg];

这是我的检索类广告数据库类是

 -(NSMutableArray *)AllRowFromTableName:(NSString *)tableName withUserID:(NSString *)userid withFriendID:(NSString *)friendid

   
NSMutableArray *array=[[NSMutableArray alloc] init];

NSString *sqlString=[NSString stringWithFormat:@"select *from chatTable where toid='%@' and fromid='%@'",userid,friendid];

sqlite3_stmt *statement;
if (sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &statement, nil)==SQLITE_OK) 

    while (sqlite3_step(statement)==SQLITE_ROW) 
         Message *tempSkeleton=[[Message alloc] init];

        tempSkeleton.mToID =[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 1)];

        tempSkeleton.mFromID=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
        tempSkeleton.text=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 3)];

        //tempSkeleton.fromMe=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
        tempSkeleton.fromMe=((int)sqlite3_column_int(statement, 4)) ?  YES : NO;
        tempSkeleton.tim_dte=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 5)];




        [array addObject:tempSkeleton];
        //  NSLog(@"IN LOOP=>%@",array);

    




我的 msg.text 为空,请大家帮帮我

【问题讨论】:

您似乎没有返回您创建的array?准备工作也有效吗?被注释掉的 NSLog "IN LOOP" 在没有被注释掉的时候会触发吗? 【参考方案1】:

在处理返回数组的循环中,这些行...

Message *msg=[[Message alloc] init];
msg.text=[[messageArray objectAtIndex:i] msg];

应该只是……

Message *msg=[[Message alloc] init];
msg.text=[[messageArray objectAtIndex:i] text];

您还应该在循环之外创建一次 NSDateFormatter 并使用它,因为它不是要创建的“快速”对象。

您可能还想重构对[messageArray objectAtIndex:i] 的常量调用。创建一个获取引用一次的局部变量,然后使用它。所以重构的代码看起来像......

messageArray=[DBObject AllRowFromTableName:@"chatTable" withUserID:myJID withFriendID:chatWithUser];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm,yyyy/MM/dd"];

for (int i=0; i<[messageArray count]; i++) 
    Message * baseMessage = [messageArray objectAtIndex:i];
    Message *msg=[[Message alloc] init];
    msg.text= baseMessage.text;
    msg.fromMe= (baseMessage.left_rght == 0);
    msg.type=SOMessageTypeText;
    msg.date=[dateFormatter dateFromString:baseMessage.tim_dte];

    [self.chatHistoryArray addObject:msg];

您也可以使用快速枚举器,也许可以查看现代目标 c https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html

【讨论】:

以上是关于如何将 sqlite3 表分配给 nsarray的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyspark 将 null 分配给配置单元表列

将行的值分配给全局变量

如何将选择结果分配给变量?

如何在 sqlite3 中正确导入和配置 .csv 表

如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

使用 Python 将 CSV 文件导入 sqlite3 数据库表