-3

下面是我的代码,我正在尝试从 my.sqlite 数据库中获取数据,但它没有执行我的 if 案例。它总是在 else 条件下进入。我在做什么错事?我无法执行我的 if 案例,即 if(sqlite3_prepare_v2(database, sqlQuerry, -1, &queerryStatement, NULL)==SQLITE_OK)

    sqlite3 *database;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"my.sqlite"];
    const char* dbPath=[databasePath UTF8String];
    if(sqlite3_open(dbPath, &database)==SQLITE_OK)
   {
      const char *sqlQuerry="SELECT * FROM Contacts;";
      sqlite3_stmt *querryStatement;
      if(sqlite3_prepare_v2(database, sqlQuerry, -1, &querryStatement, NULL)==SQLITE_OK)
      {
          NSLog(@"conversion successful....");
          while (sqlite3_step(querryStatement)==SQLITE_ROW) 
         {
             NSString *addressField = [[NSString alloc] initWithUTF8String:
                                      (const char *)    
                        sqlite3_column_text(querryStatement, 0)];

            NSString *phoneField = [[NSString alloc] initWithUTF8String:
                          (const char *) sqlite3_column_text(querryStatement, 1)];

            NSLog(@"DB ID :- %@",addressField);
            NSLog(@"DB NAME :- %@",phoneField);
        }
        sqlite3_reset(querryStatement);
    }
    else {
        NSLog(@"error while conversion....");
    }
    sqlite3_close(database);
}

///////////////////////////////////////// ////////////////////////////////////我尝试使用fmdb并将其作为bellow:但我的* s和*结果对象是获取 nil 值并且未执行 while 语句

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


NSString *path = [docsPath stringByAppendingPathComponent:@"my.sqlite"];

FMDatabase* database = [FMDatabase databaseWithPath:path];
[database open];


FMResultSet *s = [database executeQuery:@"SELECT COUNT(*) FROM Contacts"];
while ([s next]) 
{
    int totalCount = [s intForColumnIndex:0];
    NSLog(@"Count : %i", totalCount);
}

FMResultSet *results = [database executeQuery:@"select * from Contacts"];

而([结果下一个]){

    NSString *contact_id  = [results stringForColumn:@"contact_id"]; 
    NSString *name = [results stringForColumn:@"name"]; //
    NSLog(@"User: %@ - %@",name, contact_id);
}
[database close];
4

3 回答 3

1

用以下代码替换前六行:

sqlite3 *database;

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

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"my.sqlite"];

NSLog(@"DATABASE PATH=%@",databasePath); 

NSFileManager *fn=[NSFileManager defaultManager];

NSError *error;

BOOL success=[fn fileExistsAtPath:databasePath];

    if(!success) {
         NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"my.sqlite"];
         success = [fn copyItemAtPath:defaultDBPath toPath:databasePath error:&error];
                 }

const char *dbPath=[databasePath UTF8String];

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

        //. . . . your code...// 
}
于 2012-06-01T09:09:22.773 回答
0

如果您对任何 sqlite API 有问题,那么您需要使用sqlite3_errmsg()( reference ) 报告错误,这将帮助您跟踪问题。

更改您的代码以报告错误并使用日志输出更新您的问题:

if (sqlite3_open(dbPath, &database) == SQLITE_OK)
{
    ...
}
else
{
    NSLog("Failed to open database '%@': %s", databasePath, sqlite3_error(database));
}

根据sqlite3_open()此处)的文档:

.... 否则返回错误代码。sqlite3_errmsg() 或 sqlite3_errmsg16() 例程可用于在任何 sqlite3_open() 例程失败后获取错误的英语描述。

于 2012-06-01T08:44:53.643 回答
0

我发现我哪里出错了。我使用 Core Data 创建并插入数据到我的数据库中。在获取时,我想触发非常复杂的查询,所以我不得不切换到 SQLite。我做的一切都很好,但得到了错误:Table not found

实际的问题是,CoreData我的数据库的每个表名都用“z”开头的名称更改,所以我的表名 Contacts 以类似的方式更改为 ZContacts 和列名。当我在 SQLite Manager 中打开我的 sqlite 数据库时,我发现我错了。

于 2012-06-07T13:58:30.620 回答