草庐IT

sql - IOS sqlite更新查询问题

coder 2024-01-27 原文

我是 IOS 编程的新手,所以我不太确定如何最好地解决这个问题。

我有一个显示在 TableView 上的事件数据库,当您选择其中一项时,它会显示详细信息以及将其另存为“收藏夹”的选项,这只会更新数据库中的列并设置它为 1。

我有第二个 TableView ,用于查找所有将“收藏夹”设置为 1 的实例。

我遇到的问题是,我只是想出了如何让“updateItem”数据库查询在您选择的项目路径之外运行。由于每个 TableView 在不同路径上显示相同的项目,因此当您使用“收藏夹” TableView 时,“updateItem”查询正在更新数据库中不正确的项目。

我了解到在 UpdateItemAtID 方法中,它使用的是 aryDatabase,而收藏夹查询使用的是 aryDatabaseFav。我必须创建第二个数组来绕过收藏夹 TableView ,也许有更好的方法可以只使用原始 aryDatabase 数组而不是使用 2 个不同的数组来获得我想要的一切。

这是我为两个选择语句以及更新查询编写的代码,有没有更好的方法可以解决我需要项目路径的问题?

-(void)readItems {

if (!database) return; // earlier problems
if (!selStmt)
{
    const char *sql = "SELECT * FROM Events;";
    if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
    {
        selStmt = nil;
    }
}
if (!selStmt)
{
    NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}

// loop reading items from list
[aryDatabase removeAllObjects]; // clear list for rebuild
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
{ // get the fields from the record set and assign to item
    //bindings omitted
    [aryDatabase addObject:se]; // add to list
    [se release]; // free item
}
sqlite3_reset(selStmt); // reset (unbind) statement
selStmt = nil;}

-(void)readFavItems {
if (!database) return; // earlier problems
if (!selStmt)
{
    const char *sql = "SELECT * FROM Events WHERE mySchedule = 1;";
    if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
    {
        selStmt = nil;
    }
}
if (!selStmt)
{
    NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}

// loop reading items from list
[aryDatabaseFav removeAllObjects]; // clear list for rebuild
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
{ // get the fields from the record set and assign to item
    //bindings omitted
    [aryDatabaseFav addObject:se]; // add to list
    [se release]; // free item
}
sqlite3_reset(selStmt); // reset (unbind) statement
selStmt = nil;}

-(void)updateItemAtID:(NSIndexPath *)path {
singleEvent *i = (singleEvent *)[aryDatabase objectAtIndex:path.row];
int ret;

const char *sql = "UPDATE events SET mySchedule = ? WHERE _id = ?;";

if (!updStmt)
{ // build update statement
    if ((ret=sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL))!=SQLITE_OK)
    {
        NSAssert1(0, @"Error building statement to update items [%s]", sqlite3_errmsg(database));
    }
}
// bind values to statement
NSInteger m = i.intId;
sqlite3_bind_int(updStmt, 1, m);
NSInteger p = i.intPk;
sqlite3_bind_int(updStmt, 2, p);

if ((ret=sqlite3_step(updStmt)) != SQLITE_DONE)
{
    NSAssert1(0, @"Error updating values [%s]", sqlite3_errmsg(database));
}
    sqlite3_reset(updStmt);
}

最佳答案

我已经更新了代码并在 sqlite3_bind_text 上得到了 result=0。是否意味着更新没有错误或根本没有更新记录?不确定此时还能做什么...

   BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bh.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];

    NSLog(writableDBPath);

    if(success)
    {
        const char *dbPath= [writableDBPath UTF8String];

        //[G msgBox:writableDBPath title:@""];

        //const char *dbpath = [databasePath UTF8String];
        sqlite3_stmt *statement;
        sqlite3 *contactDB = NULL;

        if (sqlite3_open(dbPath, &contactDB) == SQLITE_OK)
        {

            NSString *updateSQL = @"UPDATE account SET name = ? ";
            const char *update_stmt = [updateSQL UTF8String];


            int e = sqlite3_prepare_v2(contactDB, update_stmt, -1, &statement, nil);
            if(e != SQLITE_OK) {
                NSLog(@"Problem with updateEntryWithUniqueID");
                NSLog(@"Error Code: %d, message '%s'", e, sqlite3_errmsg(contactDB));

                return;
            }else{
                NSLog(@"Updated");
                [G setNickname:thisNickname];
            }

            int result=sqlite3_bind_text(statement, 1, [thisNickname UTF8String], -1, SQLITE_TRANSIENT);
            NSLog(@"bind result= %i", result);


            if(sqlite3_step(statement) != SQLITE_DONE) {
                NSLog(@"Problems updating");
            }

            /* Finished */ 
            sqlite3_finalize(statement);
        }else
        {
            NSLog(@"Can not open DB.");
        }

    }else{
        NSLog(@"path not exsist");        }

关于sql - IOS sqlite更新查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8673535/

有关sql - IOS sqlite更新查询问题的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  8. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  9. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐