【问题标题】:Sqlite INSERT INTO does not proceed in iphone but on simulator and ipod touch? [duplicate]Sqlite INSERT INTO 不在 iphone 中进行,而是在模拟器和 ipod touch 上进行? [复制]
【发布时间】:2025-12-23 08:35:05
【问题描述】:
NSString *docsDir;
NSArray *dirPaths;

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = [dirPaths objectAtIndex:0];

databasePath = [[NSBundle mainBundle] pathForResource:@"etkYeni2" ofType:@"sqlite"];    

const char *dbpath = [databasePath UTF8String];
sqlite3_stmt    *statement;    


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

    NSLog(@"icerdeyim");

    NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO etk (etkTip) VALUES ('%@')",yeniEkleLabel.text];

    const char *query_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL);

    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSLog(@"OK INSERTED");

    } else {
        NSLog(@"NOT INSERTED !!");

    }
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);
}

这是我从文本框中获取字符串并将其插入到 sqlite 数据库的部分代码。我从 firefox 扩展 sqlite 管理器创建了数据库并将其添加到应用程序中。它在模拟器和 ipod touch 中按我想要的方式运行(插入元素,当我使用 SELECT 查询时我可以看到它们),但它没有在 iphone 上插入元素。我的 ipod touch 在 iOS 5 上,而 iphone 在 iOS 6 上。是因为 iOS 或 iphone 的版本,ipod touch 与 sqlite 的伪装不同还是什么?我阅读了这个问题的大部分答案,但仍然没有得到解决方案。在这种情况下有人可以帮助我吗? 谢谢..

【问题讨论】:

  • Application Bundle是只读的,需要将数据库复制到文档目录下使用。
  • @efdalustaoglu 你实现了我的答案吗?
  • 你实现了哪一个答案?
  • 是的,我实施并非常感谢大家。我不知道之前我不知道我必须将数据库复制到文档目录中。像你一样,@MidhunMP 和 Jitendra 的回答对我帮助很大解决它

标签: iphone ios sqlite sql-insert


【解决方案1】:

您的数据库未复制到电话目录中,您需要添加该数据库。 使用此代码。

-(void)createdatabase
{

    NSString *databaseName = @"Card.sqlite";        // Database Name



    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDir = documentPaths[0];

    NSLog(@"Dir :  %@ ",documentsDir);

    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];


    BOOL success;

        NSFileManager *fileManager = [NSFileManager defaultManager] ;

        success = [fileManager fileExistsAtPath:databasePath];


    if(success)
        return;


    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];


    NSLog(@"%@",databasePathFromApp);


    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

}

将您的 sqlite 文件添加到 mainbundle。 这真的很有帮助。

【讨论】:

    【解决方案2】:

    请尝试使用这个。如果您想在这种情况下在 sqlite 中插入数据,则必须使用此方法创建数据库并插入查询。希望对您有所帮助..

    - (void)executeQuery:(NSString *)insertQuery
    {
        sqlite3_stmt *statement;
        if (sqlite3_open([[self databaseFilePath] UTF8String],&sqliteDB) == SQLITE_OK)
        {
            if(sqlite3_prepare_v2(sqliteDB,[insertQuery UTF8String], -1, &statement, NULL) == SQLITE_OK)
            {
                if(sqlite3_step(statement) != SQLITE_DONE)
                {
                    sqlite3_finalize(statement);
                }
            }
            else
                NSLog(@"query Statement Not Compiled");
    
            sqlite3_finalize(statement);
            sqlite3_close(sqliteDB);
        }
        else
            NSLog(@"Database Not Opened");
    }
    
    
    
    - (NSString *)databaseFilePath
    {
        databaseName=@"abc.sqlite";
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *path = [paths objectAtIndex:0];
        return [path stringByAppendingPathComponent:databaseName];
    }
    

    【讨论】:

      最近更新 更多