菜鸟教程小白 发表于 2022-12-13 00:15:37

ios - 无法将数据添加到本地数据库 sqlite IOS


                                            <p><p>这是我的代码:</p>

<p>为了创建数据库,在我的 ViewDidLoad 中:</p>

<pre><code> NSString *docsDir;
    NSArray *dirPaths;

    dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    docsDir = ;
    databasePath = [ initWithString: ];

    NSFileManager *filemgr=;

    if (==NO)
    {
      NSLog(@&#34;Creating DB&#34;);
      const char *dbpath=;

      if (sqlite3_open(dbpath, &amp;contactDB)==SQLITE_OK)
      {
            char *error_msg;
            const char *sql_stmt = &#34;CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, URL TEXT, EMAIL TEXT, CODE TEXT, FULL TEXT)&#34;;

            if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &amp;error_msg) != SQLITE_OK)
            {
               NSLog(@&#34;Failed to create table&#34;);
            }

            sqlite3_close(contactDB);

      } else {
            NSLog(@&#34;Failed to open/create database&#34;);
      }
    } else {
      NSLog(@&#34;DB exists&#34;);
    }
</code></pre>

<p>我可以看到输出消息<code>"Creating DB"</code></p>

<p>然后我必须在其中添加我的数据:</p>

<pre><code>sqlite3_stmt    *statement;

                const char *dbpath = ;

                if (sqlite3_open(dbpath, &amp;contactDB) == SQLITE_OK)
                {
                  NSString *insertSQL = ;

                  const char *insert_stmt = ;

                  sqlite3_prepare_v2(contactDB, insert_stmt, -1, &amp;statement, NULL);
                  if (sqlite3_step(statement) == SQLITE_DONE)
                  {
                        NSLog(@&#34;Contact added&#34;);
                  } else {
                        NSLog(@&#34;Failed to add contact&#34;);
                  }
                  sqlite3_finalize(statement);
                  sqlite3_close(contactDB);
                } else {
                  NSLog(@&#34;PROBLEM - CONTACT NOT ADDED&#34;);
                }
</code></pre>

<p>我看到 <code>“问题 - 未添加联系人”</code> 消息。</p>

<p>有什么帮助吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题在于您在 <code>NSDocumentationDirectory</code> 中打开数据库,而不是在 <code>NSDocumentDirectory</code> 中。 </p>

<p>一些不相关的观察:</p>

<ol>
<li><p>如果 <code>sqlite3_open()</code> 失败,您应该查看有助于诊断问题根源的数字返回码。您可以在 <code>sqlite3.h</code> 头文件中查找值。</p></li>
<li><p>与您的代码示例无关的观察结果:您应该检查您的 <code>sqlite3_prepare_v2()</code> 返回代码,因为 SQL 错误通常在此处被识别,而不是在 <code>sqlite3_step()</code> .如果它返回 <code>SQLITE_OK</code> 以外的内容,则立即调用 <code>sqlite3_errmsg()</code> 以准确确定失败的原因。 </p></li>
<li><p>您不应使用 <code>stringWithFormat</code> 为 <code>INSERT</code> SQL 语句添加值。而是使用 <code>?</code> 占位符,然后使用 <a href="https://www.sqlite.org/c3ref/bind_blob.html" rel="noreferrer noopener nofollow"><code>sqlite3_bind_XXX()</code></a>将值绑定(bind)到这些 SQL 值的函数。事实上,如果您插入的任何值包含引号,您的 SQL 就会失败(并且容易受到 SQL 注入(inject)攻击)。</p></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 无法将数据添加到本地数据库 sqlite IOS,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/14149431/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/14149431/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 无法将数据添加到本地数据库 sqlite IOS