Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果(sqlite3\u步骤(语句)==SQLITE\u完成),则始终失败_Ios_Sqlite - Fatal编程技术网

Ios 如果(sqlite3\u步骤(语句)==SQLITE\u完成),则始终失败

Ios 如果(sqlite3\u步骤(语句)==SQLITE\u完成),则始终失败,ios,sqlite,Ios,Sqlite,这是我在Appdelegate.m中用于复制数据库的代码 - (void) copyDatabaseIfNeeded { NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSString *dbPath = [self getDBPath]; BOOL success = [fileManager fileExistsAtPath:dbPath];

这是我在
Appdelegate.m
中用于复制数据库的代码

- (void) copyDatabaseIfNeeded {

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSError *error;
    NSString *dbPath = [self getDBPath];

    BOOL success = [fileManager fileExistsAtPath:dbPath];


    if(!success) {

        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"LocalSongs.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if (!success)
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }

}
这是用来获取DBPath的

- (NSString *) getDBPath {


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    return [documentsDir stringByAppendingPathComponent:@"LocalSongs.sqlite"];


}
这是我的播放列表插入方法

-(NSString *)InsertPlaylist :(NSString *)PlaylistName
{
    NSLog(@"passed");
    NSString *status;


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *dbPath=[[NSString alloc]initWithString:[documentsDir stringByAppendingPathComponent:@"LocalSongs.sqlite"]];

    NSLog(@"Database Path %@",dbPath);

    sqlite3_stmt    *statement;


    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

        NSLog(@"open");

        NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO LOCALPLAYLIST (PLAYLISTNAME,getdate()) VALUES (\"%@\")",PlaylistName];

        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            status=@"Playlist Created";
        }

        else
        {
            status=@"Error occured";
        }


        return status;

    }
}
我的问题是,这个prepare_v2总是变成notdone。它总是执行else部分

if (sqlite3_step(statement) == SQLITE_DONE)

这有什么问题?请帮助我

我想您的查询有一个错误:您应该在放置
getdate()
的位置放置一个列名,即

INSERT INTO LOCALPLAYLIST (PLAYLISTNAME,getdate()) VALUES (\"%@\")
你应该使用类似于

INSERT INTO LOCALPLAYLIST (PLAYLISTNAME,MYDATECOLUMN) VALUES (\"%@\",getdate())
sqlite3\u prepare\u v2
之后,
语句
指针是
NULL


sqlite3\u prepare\u v2
sqlite3\u step
的返回值与中的返回值进行比较,以便更好地了解出了什么问题

我认为您的查询有一个错误:您应该在放置
getdate()
的位置放置一个列名,而不是

INSERT INTO LOCALPLAYLIST (PLAYLISTNAME,getdate()) VALUES (\"%@\")
你应该使用类似于

INSERT INTO LOCALPLAYLIST (PLAYLISTNAME,MYDATECOLUMN) VALUES (\"%@\",getdate())
sqlite3\u prepare\u v2
之后,
语句
指针是
NULL


sqlite3\u prepare\u v2
sqlite3\u step
的返回值与中的返回值进行比较,以更好地了解问题所在

感谢您的回复,现在我将其命名为NSString*insertSQL=[NSString stringWithFormat:@“插入本地播放列表(playlame,DATETIME)值(\“%@\”,getdate())”,playlname];但还是一样。为什么会这样呢感谢您的回复,现在我给出了NSString*insertSQL=[NSString stringWithFormat:@“插入到本地播放列表(播放名称,日期时间)值(\“%@\”,getdate()”,播放名称];但还是一样。为什么总是检查
sqlite3\u prepare\u v2的返回值。如果失败,请记录
sqlite3\u errmsg()
的结果以查看问题。切勿使用字符串格式创建查询。请正确使用
sqlite3\u bind\u xxx
。什么是
getdate()
函数?顺便说一句,SQLite.BTW中没有这样的东西,虽然我很高兴您解决了您的问题,但使用
stringWithFormat
将值插入SQL语句是不可取的。您的SQL可能类似于
插入LOCALPLAYLIST(playlistame,MYDATECOLUMN)值(?,datetime())
,然后使用
sqlite3\u bind\u text(语句,1,[PLAYLISTNAME UTF8String],-1,NULL)
将值绑定到
占位符。如果播放列表名称中有双引号,则现有代码将失败。请始终检查
sqlite3\u prepare\u v2
的返回值。如果失败,请记录
sqlite3\u errmsg()
的结果以查看问题。切勿使用字符串格式创建查询。请正确使用
sqlite3\u bind\u xxx
。什么是
getdate()
函数?顺便说一句,SQLite.BTW中没有这样的东西,虽然我很高兴您解决了您的问题,但使用
stringWithFormat
将值插入SQL语句是不可取的。您的SQL可能类似于
插入LOCALPLAYLIST(playlistame,MYDATECOLUMN)值(?,datetime())
,然后使用
sqlite3\u bind\u text(语句,1,[PLAYLISTNAME UTF8String],-1,NULL)
将值绑定到
占位符。如果播放列表名称中有双引号,则现有代码将失败。