Program crashing at sqlite3_Prepare HELP!!!!

Discussion in 'Mac Programming' started by aram063, Jan 10, 2009.

  1. aram063 macrumors newbie

    Joined:
    Dec 26, 2008
    #1
    Hi guys,

    I am trying to make a program which inserts values into a sqlite database. For some reason my program crashes every time I press the button to insert the value. I have been trying to fix this for a long time but have not been able to fix it. Can you please have a look at my code and tell me what's wrong. Im going to put the code of my .m files on here.
    Im really lost guys help me!:confused:
    BpValue.m
    Code:
    #import "BpValue.h"
    
    static sqlite3 *database = nil;
    static sqlite3_stmt *addStmt = nil;
    
    @implementation BpValue
    
    @synthesize valueID, value, isDirty, isDetailViewHydrated;
    
    + (void) finalizeStatements {
    	
    	if(database) sqlite3_close(database);
    	if (addStmt) sqlite3_finalize(addStmt);
    }
    
    - (id) initWithPrimaryKey:(NSInteger) pk {
    	
    	[super init];
    	valueID = pk;
    	
    	isDetailViewHydrated = NO;
    	
    	return self;
    }
    
    - (void) addValue {
    	
    	if(addStmt == nil) {
    		const char *sql = "insert into BPressure(Value) Values(?)";
    		if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
    			NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    	}
    	
    	sqlite3_bind_double(addStmt, 1, [value doubleValue]);
    	
    	if(SQLITE_DONE != sqlite3_step(addStmt))
    		NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    	else
    		//SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
    		valueID = sqlite3_last_insert_rowid(database);
    	
    	//Reset the add statement.
    	sqlite3_reset(addStmt);
    }
    
    - (void) dealloc {
    	
    	[value release];
    	[super dealloc];
    }
    
    @end
    MyViewController.m

    Code:
    #import "MyViewController.h"
    #import "HelloWorldAppDelegate.h"
    #import "sqlite3.h"
    #import "BpValue.h"
    
    
    @implementation MyViewController
    
    @synthesize textField;
    @synthesize label;
    @synthesize string;
    
    
    
    - (IBAction)changeGreeting:(id)sender {
    	HelloWorldAppDelegate *appDelegate = (HelloWorldAppDelegate *)[[UIApplication sharedApplication] delegate];
    	BpValue *bpObj = [[BpValue alloc] initWithPrimaryKey:0];
    	NSDecimalNumber *temp = [[NSDecimalNumber alloc] initWithString:textField.text];
    	bpObj.value = temp;
    	[temp release];
    	self.string = textField.text;
    	
        NSString *nameString = string;
        if ([nameString length] == 0) {
            nameString = @"World";
        }
        NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString];
        label.text = greeting;
    
    	//Add the object
    	[appDelegate addValue:bpObj];
    	
        [greeting release];
    	
    }
    
    
    
    - (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == textField) {
            [textField resignFirstResponder];
        }
        return YES;
    }
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    	if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    		// Initialization code
    	}
    	return self;
    }
    
    
    
    /*
     Implement loadView if you want to create a view hierarchy programmatically
    - (void)loadView {
    }
     */
    
    /*
     If you need to do additional setup after loading the view, override viewDidLoad.
    - (void)viewDidLoad {
    }
     */
    
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    	// Return YES for supported orientations
    	return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    
    - (void)didReceiveMemoryWarning {
    	[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    	// Release anything that's not essential, such as cached data
    }
    
    
    - (void)dealloc {
    	[super dealloc];
    	[label release];
        [string release];
        [super dealloc];
    }
    
    
    @end
    HelloWorldAppDelegate.m
    Code:
    #import "MyViewController.h"
    #import "HelloWorldAppDelegate.h"
    #import "BpValue.h"
    
    
    @implementation HelloWorldAppDelegate
    
    @synthesize window;
    @synthesize myViewController;
    @synthesize valuesArray;
    
    
    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    	
    	//Copy database to the user's phone if needed.
    	[self copyDatabaseIfNeeded];
    	
    	NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    	self.valuesArray = tempArray;
    	[tempArray release];
    	
        MyViewController *aViewController = [[MyViewController alloc]
    										 initWithNibName:@"ControllerView" bundle:[NSBundle mainBundle]];
        self.myViewController = aViewController;
        [aViewController release];
    	
        UIView *controllersView = [myViewController view];
        [window addSubview:controllersView];
        [window makeKeyAndVisible];
    }
    
    
    - (void)applicationWillTerminate:(UIApplication *)application {
    	// Save data if appropriate
    	
    	//Save all the dirty coffee objects and free memory.
    	[self.valuesArray makeObjectsPerformSelector:@selector(saveAllData)];
    	
    	[BpValue finalizeStatements];
    }
    
    - (void)dealloc {
    	[valuesArray release];
        [myViewController release];
        [window release];
        [super dealloc];
    }
    
    - (void) copyDatabaseIfNeeded {
    	
    	//Using NSFileManager we can perform many file system operations.
    	NSFileManager *fileManager = [NSFileManager defaultManager];
    	NSError *error;
    	NSString *dbPath = [self getDBPath];
    	BOOL success = [fileManager fileExistsAtPath:dbPath];
    	
    	if(!success) {
    		
    		NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Database.sqlite"];
    		success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
    		
    		if (!success)
    			NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    	}
    }
    
    - (NSString *) getDBPath {
    	
    	//Search for standard documents using NSSearchPathForDirectoriesInDomains
    	//First Param = Searching the documents directory
    	//Second Param = Searching the Users directory and not the System
    	//Expand any tildes and identify home directories.
    	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    	NSString *documentsDir = [paths objectAtIndex:0];
    	return [documentsDir stringByAppendingPathComponent:@"Database.sqlite"];
    }
    
    - (void) addValue:(BpValue *)bpObj {
    	
    	//Add it to the database.
    	[bpObj addValue];
    	
    	//Add it to the coffee array.
    	[valuesArray addObject:bpObj];
    }
    
    @end

    Please if someone knows whats wrong, please tell me. It crashes at sqlite_prepare3. Following is part of the crash report

    Exception Type: EXC_BAD_ACCESS (SIGBUS)
    Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000030
    Crashed Thread: 0

    Application Specific Information:
    iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A345)

    Thread 0 Crashed:
    0 libsqlite3.0.dylib 0x93d211f0 sqlite3Prepare + 48
    1 HelloWorld 0x000031c8 -[BpValue addValue] + 89 (BpValue.m:38)
    2 HelloWorld 0x00002b70 -[HelloWorldAppDelegate addValue:] + 36 (HelloWorldAppDelegate.m:84)
    3 HelloWorld 0x00002e6b -[MyViewController changeGreeting:] + 509 (MyViewController.m:41)
    4 UIKit 0x30a5e25e -[UIApplication sendAction:to:from:forEvent:] + 116
    5 UIKit 0x30abb022 -[UIControl sendAction:to:forEvent:] + 67
    6 UIKit 0x30abb4ea -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 478
    7 UIKit 0x30aba830 -[UIControl touchesEnded:withEvent:] + 483
    8 UIKit 0x30a75c0b -[UIWindow sendEvent:] + 454
    9 UIKit 0x30a65e07 -[UIApplication sendEvent:] + 269
    10 UIKit 0x30a6522a _UIApplicationHandleEvent + 4407
    11 GraphicsServices 0x31699522 SendEvent + 35
    12 GraphicsServices 0x3169b88c PurpleEventTimerCallBack + 276
    13 com.apple.CoreFoundation 0x971be615 CFRunLoopRunSpecific + 3141
    14 com.apple.CoreFoundation 0x971becf8 CFRunLoopRunInMode + 88
    15 GraphicsServices 0x31699d38 GSEventRunModal + 217
    16 GraphicsServices 0x31699dfd GSEventRun + 115
    17 UIKit 0x30a5dadb -[UIApplication _run] + 440
    18 UIKit 0x30a68ce4 UIApplicationMain + 1258
    19 HelloWorld 0x00002650 main + 102 (main.m:14)
    20 HelloWorld 0x000025be start + 54

    Thread 1:
    0 libSystem.B.dylib 0x93b624a6 mach_msg_trap + 10
    1 libSystem.B.dylib 0x93b69c9c mach_msg + 72
    2 com.apple.CoreFoundation 0x971be0ce CFRunLoopRunSpecific + 1790
    3 com.apple.CoreFoundation 0x971becf8 CFRunLoopRunInMode + 88
    4 WebCore 0x32a8a450 RunWebThread + 384
    5 libSystem.B.dylib 0x93b936f5 _pthread_start + 321
    6 libSystem.B.dylib 0x93b935b2 thread_start + 34

    Thread 2:
    0 libSystem.B.dylib 0x93b624a6 mach_msg_trap + 10
    1 libSystem.B.dylib 0x93b69c9c mach_msg + 72
    2 GraphicsServices 0x3169ce0a EventReceiveThread + 467
    3 libSystem.B.dylib 0x93b936f5 _pthread_start + 321
    4 libSystem.B.dylib 0x93b935b2 thread_start + 34

    Thread 3:
    0 libSystem.B.dylib 0x93b624a6 mach_msg_trap + 10
    1 libSystem.B.dylib 0x93b69c9c mach_msg + 72
    2 com.apple.CoreFoundation 0x971be0ce CFRunLoopRunSpecific + 1790
    3 com.apple.CoreFoundation 0x971becf8 CFRunLoopRunInMode + 88
    4 com.apple.CFNetwork 0x95a59a32 CFURLCacheWorkerThread(void*) + 396
    5 libSystem.B.dylib 0x93b936f5 _pthread_start + 321
    6 libSystem.B.dylib 0x93b935b2 thread_start + 34

    Thread 0 crashed with X86 Thread State (32-bit):
    eax: 0x000040b0 ebx: 0x0000317d ecx: 0xffffffff edx: 0x00003e18
    edi: 0x00000000 esi: 0x004123a0 ebp: 0xbfffe5c8 esp: 0xbfffe470
    ss: 0x0000001f efl: 0x00010282 eip: 0x93d211f0 cs: 0x00000017
    ds: 0x0000001f es: 0x0000001f fs: 0x00000000 gs: 0x00000037
    cr2: 0x00000030

    HELP!!!!:confused::confused::confused::confused:
     
  2. BorgCopyeditor macrumors newbie

    Joined:
    Jan 7, 2009
    #2
    My C-fu is pretty poor, but here's an attempt:

    What is the value of addStmt supposed to be? It looks like it's nil when you pass it's address to sqlite3Prepare, which means that that function will try to write to that location in memory, which it's (rightly) not being allowed to do. (An address as low as 0x0000000000000030 should be a sign that something is not pointing where it ought to.)

    Learning about how to use the debugger would give you more useful information. You can use it to pause a program and tell you exactly what the value of a variable is before you send it to the function that causes the crash.
     

Share This Page