菜鸟教程小白 发表于 2022-12-13 10:52:43

ios - 从 TableView 中删除行并从 sqlite 数据库中删除记录


                                            <p><p>我使用以下语句创建了一个 sqlite 表:</p>

<pre><code>&#34;CREATE TABLE IF NOT EXISTS reminders (ID INTEGER PRIMARY KEY,Name VARCHAR(64), Event VARCHAR(64), Date VARCHAR(64), Bfr VARCHAR(64), Val VARCHAR(64),Num VARCHAR(64), Bod VARCHAR(400) ,Grp VARCHAR(64))&#34;;
</code></pre>

<p>我已经成功地从 sqlite 数据库插入数据和检索数据,并以编程方式在 View 提醒中显示提醒!</p>

<p>但是我对从 sqlite 数据库中删除记录感到震惊。我的意思是我使用模型类来保存名称、事件、日期等值...在添加提醒页面中,我已经为变量分配了值在模型类中声明,即</p>

<p>textField.text = remClass.Name 等等。</p>

<p>我的描述可能听起来令人困惑,但上述信息总是有助于轻松回答这个问题。</p>

<p>我添加了提醒页面,用户在其中输入数据并单击保存,然后将数据插入到数据库中。有查看提醒页面,用户可以在其中查看已保存的提醒。其中有 3 种不同的方式来查看提醒: viewAll,viewMonthly,viewGroup.Now 在 View 中我能够使用以下语句显示每个提醒的唯一 ID:</p>

<pre><code>ReminderClass *loadedReminder = [ init];

loadedReminder.reminderID = sqlite3_column_int(statement, 0);
</code></pre>

<p>提醒类是一个模型类,它保存在添加提醒页面中输入的所有值。</p>

<p>为了显示保存的提醒,我使用了一个数组并在检索每一行后添加了模型类对象,即id、name、event、date 等.. 并相应地填充表格 View 。假设我保存 3 个提醒,那么部分是 3 个明智的等等...</p>

<p>现在如果我点击 View 组提醒页面中的编辑按钮,那么我们知道我们可以通过点击左侧的方向按钮来删除表格 View 的行(部分)。</p>

<p>如果我删除该行,说一行有提醒。那么与该提醒对应的数据也应该从sqlite数据库中删除。</p>

<p>我该怎么做,我已经经历了这个<a href="https://stackoverflow.com/questions/7306309/delete-row-from-table-and-sqlite-database" rel="noreferrer noopener nofollow">link</a>听起来与我的要求相似。但它不起作用。</p>

<p>最后我实现了以下删除代码:</p>

<pre><code>if (editingStyle == UITableViewCellEditingStyleDelete)
    {      
      ;

      if(sqlite3_open(, &amp;remindersDB)==SQLITE_OK)
      {   
            sqlite3_stmt *compiledstatement;

            int pk = sqlite3_column_int(compiledstatement, 0);
            NSString *querySQL = ;

            const char *sqlstmt=;

            if(sqlite3_prepare_v2(remindersDB, sqlstmt, -1, &amp;compiledstatement, NULL)==SQLITE_OK)
            {               
                if(SQLITE_DONE != sqlite3_step(compiledstatement))

                  NSAssert1(0,@&#34;Error while creating delete statement =&gt; %s&#34;,sqlite3_errmsg(remindersDB));
            }
            NSLog(@&#34;delete DONE&#34;);
            sqlite3_finalize(compiledstatement);
      }
      sqlite3_close(remindersDB);

      ;
    }
</code></pre>

<p><strong>检索代码:</strong></p>

<pre><code>-(void)loadgReminders
{

    EventsReminderAppDelegate *appDelegate = (EventsReminderAppDelegate *)[delegate];
    NSLog(@&#34;String = %@&#34;,appDelegate.groupString);

    self.grpArray = nil;
    self.grpArray = [init];

    //Retrieve the group of reminder
    const char *thePath = ;
    sqlite3_stmt *statment;

    if (sqlite3_open(thePath, &amp;remindersDB) == SQLITE_OK)
    {
      NSString *getQuery = ;
      const char *sqlite_stmt = ;

      if (sqlite3_prepare_v2(self.remindersDB, sqlite_stmt, -1, &amp;statment, NULL) == SQLITE_OK)
      {
            while (sqlite3_step(statment) == SQLITE_ROW)
            {
                ReminderClass *remind = [init];
                remind.reminderID = sqlite3_column_int(statment, 0);
                **NSLog(@&#34;reminderID=%d&#34;,remind.reminderID);**
                remind.Name = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 1)];
                remind.Event = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 2)];
                remind.Date = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 3)];
                remind.numDays = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 4)];
                remind.selString = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 5)];
                remind.number = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 6)];
                remind.msgBody = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 7)];
                remind.remGroup = [initWithUTF8String:(const char *)sqlite3_column_text(statment, 8)];

                NSDateFormatter *dateFormat = [[init]autorelease];
                ;
                NSDate *date = ;
                ;
                NSString *dateVal = ;
                remind.Date = dateVal;

                ;

                ;
            }

            sqlite3_finalize(statment);
      }

      sqlite3_close(remindersDB);
    }
}
</code></pre>

<p>我使用 NSLog 来检查提醒 ID 值是否正确显示:</p>

<p> <img src="/image/8YxhE.png" alt="enter image description here"/> </p>

<p>但是,当我尝试对删除执行相同操作以检索 id 值并将该 id 值分配给 where id=? 时,出了什么问题。</p>

<p>它不起作用,我错在哪里?</p>

<p>谁能帮帮我?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>编辑:</p>

<p>阅读评论后,您似乎在将内存提醒 (id) 与数据库中要删除的 id 对齐时遇到问题。数组索引不一定对应。当您使用插入语句创建提醒时,您必须立即在该调用之后调用 sqlite3_last_insert_rowid,因为它已生成。然后将您的模型类提醒ID 分配给它。然后在删除中,只需阅读提醒ID 即可组成您的删除语句。请再次记录所有内容。 </p>

<p> <a href="http://www.sqlite.org/capi3ref.html#sqlite3_last_insert_rowid" rel="noreferrer noopener nofollow">http://www.sqlite.org/capi3ref.html#sqlite3_last_insert_rowid</a> </p>

<p>插入后,如果您选择了提醒列表,请确保您选择了 id 列并分配给模型提醒Id,以便您知道要删除的内容。在插入和选择情况下,您需要确保最终模型的提醒ID 等于从数据库生成的 id。</p>

<p>首字母:</p>

<p>从代码看来,您正在使用已编译语句(这很好),这意味着您调用 prepare 并保存已编译语句以供重复使用。如果您正在重复使用(看不到所有代码),请确保在其上调用 sqlite3_reset。此外,如果您正在重复使用,则在您完全使用它之前不应该最终确定它。</p>

<p>如果这不是问题,从注销 pk 和组合的 sql 语句开始。确保这是您所期望的。例如,如果它是 0,而您说 delete where pk = 0,那么它不会失败 - 它不会做任何事情,因为没有 id 为 0 的行(从 1 开始)。</p>

<p>之后,从 sqlite3 命令行尝试相同的语句。您可以注销模拟器正在使用的路径。</p>

<p>另外,注销返回码(只是不要检查 SQLITE_DONE。除了错误消息之外,我还提供提示。</p>

<p>希望其中一个能指引你正确的方向。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 TableView 中删除行并从 sqlite 数据库中删除记录,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/8972378/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/8972378/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 TableView 中删除行并从 sqlite 数据库中删除记录