【问题标题】:Not able to retrieve data from database in ios无法从ios中的数据库中检索数据
【发布时间】:2012-01-12 06:07:30
【问题描述】:

我想将一些数据保存到sqlite数据库并读取它,保存数据时没有问题,但我无法从数据库中检索数据。

这是我正在使用的代码。

//>>>>>> to save in sqlite Database

-(void)saveData
{
    NSString *strTxtFldValue = txtFldName.text;

    sqlite3_stmt *statement;
    const char *dbpath = [appDel.databasePath UTF8String];

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO TESTTABLE (NAME) VALUES (\"%@\")",strTxtFldValue];

        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(database, insert_stmt, 
                           -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            NSLog(@"Data is added succesfully ");

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:@"Name is added successfully." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
        } else {

            NSLog(@"Failed to add data");
        }
        sqlite3_finalize(statement);
        sqlite3_close(database);
    }
}

//>>>>>> to read from database 

//here the control comes till second NSLog and the "sqlite3_prepare_v2" statement doesn't get execute.

-(void)readData{

    const char *dbpath = [appDel.databasePath UTF8String];
    sqlite3_stmt *statement;
    NSLog(@"^^^^^^^ 1");

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSLog(@"^^^^^^^ 2");

       // NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM TESTTABLE"];
        NSString *querySQL = [NSString stringWithFormat:@"SELECT NAME FROM TESTTABLE"];

    const char *query_stmt = [querySQL UTF8String];

        **if (sqlite3_prepare_v2(database,query_stmt, -1, &statement, NULL) == SQLITE_OK)**
        {    
            NSLog(@"^^^^^^^ 3");            
            while(sqlite3_step(statement) == SQLITE_ROW)
            {
        NSLog(@"^^^^^^^ 4");

        NSString *cName = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
                NSLog(@"~~~~### cName = %@",cName);

                Names *name = [[Names alloc] initWithName:cName];
                [names addObject:name];
                [name release];             
            }

            sqlite3_finalize(statement);
        }
        sqlite3_close(database);
    }
}

请提供解决方案。

提前致谢

【问题讨论】:

    标签: iso


    【解决方案1】:

    在运行时创建数据库,并使用以下逻辑,

    在sqlite中写入数据。

        sqlite3 *pDb; 
    char *databaseName; 
    
    databaseName = @"TempDatabase.sql";
    
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    //databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    
    databasePath =[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"TempDatabase.sql"];
    
    //[self copyDatabaseIfNeeded];
    
    
    if(sqlite3_open([databasePath UTF8String], &pDb) == SQLITE_OK) 
    {
    
        const char *sqlStatement = "INSERT INTO tablename (name) VALUES(?)";
    
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(pDb, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
        {
    
    
             sqlite3_bind_text( compiledStatement, 1, [strTxtFldValue UTF8String], -1, SQLITE_TRANSIENT);
        }
        if(sqlite3_step(compiledStatement) != SQLITE_DONE ) 
        {
             NSLog( @"~~~~~~~~~~~ 1 Error: %s", sqlite3_errmsg(pDb) );
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Name name is not added." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
    
        } else {
    
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:@"name is added successfully." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
    
                }
        sqlite3_finalize(compiledStatement);
    }
    
    sqlite3_close(pDb);
    

    从 sqlite 读取数据

         sqlite3 *database;
    const char *dbpath = [appDel.databasePath UTF8String];
    sqlite3_stmt *statement;
    
    
    NSMutableArray *names = [[NSMutableArray alloc]init];
    
    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
    {
    
    
        const char *sqlStatement = "select name from tablename";
    
    
        if (sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) 
            {
                NSString *cName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)];
                //NSLog(@"cName = %@",cName);
    
                Names *name = [[Names alloc] initWithName:cName];
                [names addObject:name];
                [name release];
            }
    
        }
        sqlite3_finalize(statement);
    
    }
    sqlite3_close(database);
    

    试试这个,如果它适合你,给我投票。

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2012-09-20
      相关资源
      最近更新 更多