sqlite3_prepare_v2失败(Xcode sqlite 3)

时间:2012-01-25 14:16:14

标签: iphone objective-c ios sqlite

我正在尝试连接sqlite但不能。有人能帮我吗?我在这里看不到任何错误,我在谷歌和这里搜索了这个问题的高低,但我找不到任何方法来解决这个问题。

我正在关注教程here

请帮助我,我对这个错误感到疯狂。 =(

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

sqlite3 *contactDB;  //declare pointer to database structurery
const char *dbPath = [databasePath UTF8String];  //convert NSString to UTF8String

//open database file. TRUE = success, FALSE = failed
if (sqlite3_open(dbPath, &contactDB)== SQLITE_OK){     
    NSLog(@"Opened");

sqlite3_stmt *statement;
NSString *querySQL =  @"SELECT address, phone FROM contacts";
const char *query_stmt = [querySQL UTF8String];

if (sqlite3_prepare_v2(contactDB, query_stmt, 1, &statement, NULL) == SQLITE_OK) {
    NSLog(@"Statement is OK");
}else{
    NSLog(@"Statement FAILED");
}

}else{
    NSLog(@"Failed");
}

日志只显示“已打开”,然后显示“语句失败”

3 个答案:

答案 0 :(得分:6)

我就是这样做的。 (我的数据库类的编译部分)
显示sql错误。

sqlite3 *_database;
sqlite3_open([databasePath UTF8String], &_database);

NSString *sqlStatement = @"SELECT address, phone FROM contacts";
const char *sql = [sqlStatement UTF8String];
static sqlite3_stmt *compiledStatement;
int result = sqlite3_prepare_v2(_database, sql, -1, &compiledStatement, NULL);
if(result != SQLITE_OK) {
    NSLog(@"Prepare-error #%i: %s", result, sqlite3_errmsg(_database));
}

result = sqlite3_step(compiledStatement);
if (result != SQLITE_DONE) {
    NSLog(@"Step-error #%i for '%@': %s", result, sqlStatement, sqlite3_errmsg(_database));
}

sqlite3_finalize(compiledStatement);

答案 1 :(得分:1)

错误在这行代码中。

if (sqlite3_prepare_v2(contactDB, query_stmt, 1, &statement, NULL) == SQLITE_OK) {

1错了。来自SQLite文档:

int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);

If the nByte argument is less than zero, then zSql is read up to the first zero
terminator. If nByte is non-negative, then it is the maximum number of bytes
read from zSql.

所以你强迫SQLite只读取语句中的第一个字节。当然这是无效的。

答案 2 :(得分:0)

确保您在项目中完成了这些要点。

  1. 确认该文件列在" 复制捆绑资源"在您的目标" 构建阶段"而不是" 复制文件"使用自定义目标或子路径。

  2. 确保您与sqlite文件没有任何路径冲突。我的意思是文档directory/database path/是正确的。

  3. 我已经实现了像

    这样的sqlite查询

    SELECT * FROM someTable WHERE status LIKE 'someString' AND BankName LIKE 'someString' 而不是 SELECT * FROM someTable WHERE status='someString' AND BankName='someString'

  4. 确保您没有在任何其他应用程序中包含sqlite文件

  5. 确保您没有具有相同路径的重复sqlite文件。

  6. 经过多次努力,这对我有用,我希望它有所帮助。如果有帮助,请投票。