sqlite3 prepare语句不起作用,可能是iOS指针不正确

时间:2015-01-01 18:52:19

标签: ios objective-c pointers sqlite

我已经设置了一个GlobalVars类来保存我的sqlite3数据库变量。

static sqlite3** database;
const char *dbPath;


@implementation GlobalVars : NSObject

+(GlobalVars*)sharedInstance {
    static GlobalVars *myInstance = nil;
    if(myInstance == nil) {
        myInstance = [[[self class] alloc] init];
    }

    return myInstance;
}

+(sqlite3*)getGlobalDatabase {
    return &database;
}

+(void)setGlobalDatabase:(sqlite3*)_database {
    database = &_database;
}

然后在头文件中我有

static sqlite3** database;

位于界面之上。这就是我设置数据库变量的方式。

当我打开数据库并准备它时,我正试图访问它。我可以打开它,因为open调用返回true。我无法正确地准备它,因为该语句返回false并且它不会进入if语句。我想知道我是否搞砸了我的指针,因为准备声明不起作用,并且没有正确准备。

-(void)setAllValues:(NSMutableArray*)array {
if(sqlite3_open([GlobalVars getGlobalDBPath], [GlobalVars getGlobalDatabase]) == SQLITE_OK) {
    sqlite3_stmt *insertStatement;
    NSString *sqlInsert = [NSString stringWithFormat:@"insert into my_table ('_id', 'name', 'age', 'weight', 'height', 'description') VALUES (%i, '%@', '%i', '%i', '%@', '%@')", ID, name, age, weight, height, description];

//*********** This is not opening, and SQLITE_OK is equal to false ***********

if(sqlite3_prepare_v2(([GlobalVars getGlobalDatabase]), [sqlInsert UTF8String], -1, &insertStatement, nil) == SQLITE_OK) {
        if(sqlite3_step(insertStatement) == SQLITE_DONE) {
            NSLog(@"insert stepping done");
        }

        sqlite3_reset(insertStatement);
    }
    sqlite3_finalize(insertStatement);
    sqlite3_close([GlobalVars getGlobalDatabase]);
}
}

数据库的变量都填充了正确的数据,似乎没有问题地打开数据库。在准备时,它不能正常工作并返回false。任何想法为什么。感谢您的协助,我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

**

你必须尝试这个...也许它会帮助你:

**

    #import "DBManager.h"
#import "userRegistrationClass.h"

static DBManager *sharedInstance = nil;
static sqlite3 *database = nil;
static sqlite3_stmt *statement = nil;

@implementation DBManager


#pragma mark
#pragma mark Get shared Function
+(DBManager*)getSharedInstance{
    if (!sharedInstance) {
        sharedInstance = [[super allocWithZone:NULL]init];
        [sharedInstance createDB];
    }
    return sharedInstance;
}

#pragma mark
#pragma mark Create DataBase
-(BOOL)createDB{
    NSString *docsDir;
    NSArray *dirPaths;
    // Get the documents directory
//    http://www.mycashkit.com/my-earnings.php
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"Dir Path Value is  %@",dirPaths);
    docsDir = [dirPaths objectAtIndex:0];
    NSLog(@"DocsDir Path Value is %@",docsDir);
    // Build the path to the database file
    databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"UserRegInfo.sqlite"]];
    NSLog(@"Data base Work's %@:",databasePath);
    BOOL isSuccess = YES;
    NSFileManager *filemgr = [NSFileManager defaultManager];
   // NSString *currentPath = [filemgr currentDirectoryPath];
    NSLog(@"My file managaer value is %@",filemgr);
    //NSLog(@"My current drictory path is %@",currentPath);
    //the file will not be there when we load the application for the first time
    //so this will create the database table
    if ([filemgr fileExistsAtPath: databasePath ] == NO)
    {
        const char *dbpath = [databasePath UTF8String];

        NSLog(@"Constan charcter value is %s:-",dbpath);

        if (sqlite3_open(dbpath, &database) == SQLITE_OK)
        {
            char *errMsg;
            const char *sql_stmt = "create table if not exists UserInfo(UserID integer primary key, UserName,Gender,UserEmailID,Password,RePassword,DOB, MobileNo,IsUserType)";
            const char *sql_stmt2 = "create table if not exists TestInfo(TestID integer primary key, TestName,TestType)";

//            NSString *dbPathFromApp=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"UserRegInfo.sqlite"];[filemgr copyItemAtPath:dbPathFromApp toPath:databasePath error:nil];

            NSLog(@"Constan charcter value is %s:-",dbpath);
            if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) && (sqlite3_exec(database, sql_stmt2, NULL, NULL, &errMsg)!= SQLITE_OK))
            {
                isSuccess = NO;
                NSLog(@"Failed to create table");
            }
            NSLog(@"Print Sqlite%d",(sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg)));
            sqlite3_close(database);
            return  isSuccess;
        }
        else {
            isSuccess = NO;
            NSLog(@"Failed to open/create database");
        }

    }
    return isSuccess;
}
#pragma mark
#pragma mark Save Data Function

-(BOOL)saveData:(NSString*)insertSQL{
    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {

        NSLog(@" my Sqlite Query is :- %@",insertSQL);
        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            return YES;
        }
        else
        {
            NSLog(@"Squlite Error Msg is %s",sqlite3_errmsg(database));
            return NO;
        }
    }
    return NO;
}