菜鸟教程小白 发表于 2022-12-12 13:45:51

ios - iOS 应用程序中的 SQlite 数据库在下载后被加密


                                            <p><p>我想创建一个简单的 iOS 应用。这个应用程序从 URL 下载一个简单的 SQlite 数据库。
但是当数据库下载并存储在 Documents 文件夹中时,我无法通过一些 SQLite 管理器打开它,因为它说它是加密的,尽管原始数据库不是。</p>

<p>读取这个数据库的代码也不能正常工作,我认为是因为数据库在 Documents 文件夹中加密。这是我到目前为止所得到的。</p>

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


    NSString *stringURL = @&#34;https://www.dropbox.com/s/cq8y6x29e6ku65r/database.sqlite&#34;;
    NSURL*url = ;
    NSData *urlData = ;

    if ( urlData != nil )
    {
      NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString*documentsDirectory = ;

      NSString*filePath = ;
      ;
      NSLog(@&#34;Stahujem databazu do: %@&#34;, filePath);
    }
}
</code></pre>

<p>这就是我在应用程序中下载数据库的方式。</p>

<pre><code>// Get the documents directory
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = dirPaths;

    // Build the path to the database file
    NSString *databasePath = [
                  initWithString: [docsDir stringByAppendingPathComponent:
                                     @&#34;database.sqlite&#34;]];

    const char *dbpath = ;
    sqlite3_stmt    *statement;

    if (sqlite3_open(dbpath, &amp;myDatabase) == SQLITE_OK)
    {
      NSString *querySQL = @&#34;SELECT * FROM CHAMPIONS&#34;;

      const char *query_stmt = ;

      if (sqlite3_prepare_v2(myDatabase, query_stmt, -1, &amp;statement, NULL) == SQLITE_OK)
      {
            ;
            while (sqlite3_step(statement) == SQLITE_ROW)
            {

                NSString *text = [
                                  initWithUTF8String:
                                  (const char *) sqlite3_column_text(
                                                                     statement, 1)];

                ;
                statusOfGettingDataFromDB = @&#34;Found!&#34;;
                NSLog(@&#34;count: %d&#34;, );
            }
            sqlite3_finalize(statement);
      }
      sqlite3_close(myDatabase);
    }
</code></pre>

<p>通过这段代码,我试图从数据库中获取一些数据。但是在 <code>sqlite3_prepare_v2</code> 之后它会直接跳到最后。</p>

<p>你能告诉我一些我做错了什么吗?并建议我如何解决这个问题?
我真的很感激。谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您正在下载的 URL 当前返回的是 HTML 页面,而不是 SQLite 文件。 </p>

<p>因此,您写入文档目录的 <code>.sqlite</code> 文件无效。如果您修改 URL,您的代码将正常工作</p>

<p>尝试使用此 URL,这是单击 Dropbox 页面上的“下载”按钮时点击的实际 URL。</p>

<pre><code>https://dl.dropboxusercontent.com/s/cq8y6x29e6ku65r/database.sqlite?token_hash=AAH9fdYQzZ6zj8CzhKVBGMi4LcaCRCHNKIlw88wLLskRWQ&amp;dl=1
</code></pre>

<p>我尝试了您的代码并打印了从 sqlite db 获取的 <code>list</code> 数组,这是我在日志中得到的结果,</p>

<pre><code>(
Ahri,
Aatrox
)
</code></pre>

<p>希望有帮助!</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - iOS 应用程序中的 SQlite 数据库在下载后被加密,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18378281/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18378281/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - iOS 应用程序中的 SQlite 数据库在下载后被加密