【问题标题】:Trying to Fetching data from sqlite database尝试从 sqlite 数据库中获取数据
【发布时间】:2012-06-06 12:01:53
【问题描述】:

下面是我的代码,我正在尝试从 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 并按照以下方式进行操作: 但是我的 *s 和 *results 对象正在获得 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"];

while([结果下一个]) {

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

【问题讨论】:

  • 是的,我也尝试过 FMDB,但失败了……
  • 尝试一件事,而不是const char *sqlQuerry="SELECT * FROM Contacts;";,尝试使用NSString*sqlStatement=[NSString stringWithFormat:@"select * from Contacts"]; const char*sqlStmt=[sqlStatement UTF8String];,然后尝试使用sqlite3_errmsg()
  • 那么错误是什么?你永远不知道它实际上可能会告诉你什么是坏的。
  • 尝试命名字段而不是使用 *.
  • 我尝试使用字段名称但没有成功

标签: iphone objective-c ios sqlite


【解决方案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...// 
}

【讨论】:

  • 我已经尝试过您的代码,但问题仍然存在,我没有获取数据,否则 case 语句执行给出输出:转换时出错......
  • 检查你的 my.sqlite 文件保存在项目中的什么位置。
  • 数据库名称和路径是正确的,我已经检查过了,里面也有数据...
  • 尝试:1. 调试并查看 entitySubjects 是否不为零 2. 尝试 Product->Clean,Product->Build 然后尝试运行,如果它没有帮助 3. 如果您添加了新的模型版本,您可能忘记将其设置为“当前版本”,如果不是这样 4. 您的数据可能已损坏,请尝试将其删除并再次运行 5. 最后一次尝试是重新创建您的模型,可能出现问题
【解决方案2】:

如果您对任何 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() (here) 的文档:

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

【讨论】:

  • @SurajMirajkar 使用 sqlite_error() 找出你最终进入 else-part 的原因。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多