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)
将值绑定到?
占位符。如果播放列表名称中有双引号,则现有代码将失败。