SQlite在iOS App中插入数据

时间:2017-11-07 12:01:45

标签: ios objective-c sqlite

我正在关注一些来自youtube的教程,用于sqlite crud操作。我有文字字段,名称,联系人和地址,当我点击保存按钮时,它在控制台中显示消息,数据被保存,但当我看数据库时,它没有出现。我的数据库路径是正确的,代码中没有错误,但我很困惑为什么它不会。我的路径代码就是这个,

-(void)copyandpaste{
NSArray *arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str1 = [arr1 objectAtIndex:0];
strpath = [str1 stringByAppendingPathComponent:@"personinfo.sqlite"];

if (![[NSFileManager defaultManager]fileExistsAtPath:strpath]) {
    NSString *local = [[NSBundle mainBundle]pathForResource:@"personinfo" ofType:@"sqlite"];
    [[NSFileManager defaultManager]copyItemAtPath:local toPath:strpath error:nil];
}
NSLog(@"%@",strpath);
}

此方法在appdelegate.m文件中调用,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self copyandpaste];
return YES;
}

我有疯狂的NSObject类用于数据库连接。连接代码是这个,

-(id)init{
appdel = (AppDelegate *)[[UIApplication sharedApplication]delegate]; //get all methods in AppDelegate
strmain = appdel.strpath;
return self;
}

-(NSMutableArray *)getalluser:(NSString *)query{

arrdata = [[NSMutableArray alloc]init];

if (sqlite3_open([strmain UTF8String], &(database))==SQLITE_OK) {
    sqlite3_stmt *connection;
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &connection, nil)==SQLITE_OK) {
        while (sqlite3_step(connection)==SQLITE_ROW) {
            NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];

            NSString *str12 = [[NSString alloc]initWithUTF8String:(char *)sqlite3_column_text(connection, 0)];  //name in first column

            NSLog(@"Checking");

            NSString *str13 = [[NSString alloc]initWithUTF8String:(char *)sqlite3_column_text(connection, 1)];  //contact in second column

             NSString *str14 = [[NSString alloc]initWithUTF8String:(char *)sqlite3_column_text(connection, 2)]; //address in third column

            [dic setObject:str12 forKey:@"name"];
            [dic setObject:str13 forKey:@"contact"];
            [dic setObject:str14 forKey:@"address"];
            [arrdata addObject:dic];
        }
    }

    sqlite3_finalize(connection);
}
sqlite3_close(database);
return arrdata;
}

带有查询的保存按钮代码是

- (IBAction)btnSave:(id)sender {


NSString *saveDATA=[[NSString alloc]initWithFormat:@"insert into stuInfo values('%@','%@','%@')",txtName,txtContact,txtAddress];

dboperations *db = [[dboperations alloc ]init];
BOOL ds = [db getalluser:saveDATA];

if (ds) {
    NSLog(@"Data Saved in database");
}else{
     NSLog(@"Data is not Saved in database");
}
}

2 个答案:

答案 0 :(得分:2)

 - (NSString*) saveData:(NSString *)name cont:(NSString *)contacts  add:(NSString *)address
    {
const char *dbpath = [YOUR_DATA_BASE_PATH UTF8String];

if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
    NSLog(@"=============saveData open==============");
    const char * query="insert into YOUR_TABLE_NAME(name,contacts,address) values(?,?,?);";

    sqlite3_stmt *inset_statement;

    char *errMsg;

    if (sqlite3_open(dbpath, &database)!=SQLITE_OK) {
        NSLog(@"Error to Open");
        return nil;
    }

    if (sqlite3_prepare_v2(database, query , -1,&inset_statement, NULL) != SQLITE_OK )
    {
        NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));
        NSLog(@"Error to Prepare");
        return nil;
    }
    //No of data to insert
    sqlite3_bind_text(inset_statement,1,[name  UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(inset_statement,2,[contacts  UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(inset_statement,3,[address  UTF8String], -1, SQLITE_TRANSIENT);


    if(sqlite3_step(inset_statement)== SQLITE_DONE)
    {
        long long lastRowId = sqlite3_last_insert_rowid(database);
        NSString *rowId = [NSString stringWithFormat:@"%d", (int)lastRowId];
        NSLog(@"Row ID of Last Inserted row %@",rowId);
        sqlite3_finalize(inset_statement);
        sqlite3_close(database);
        NSLog(@"=============saveData Close==============");
        return rowId;
    }
    if (sqlite3_exec(database, query, NULL, NULL, &errMsg)
        != SQLITE_OK)
    {
     NSLog(@"Failed to Insert msg in message table Error = %s",errMsg);
          sqlite3_finalize(inset_statement);
          sqlite3_close(database);
          NSLog(@"=============saveData Close==============");
          return nil;
       }
          else
           {
            sqlite3_finalize(inset_statement);
            }
          }

          NSLog(@"=============saveData Close==============");
          sqlite3_close(database);
          return nil;
          }

答案 1 :(得分:0)

如果您正在准备的SQLite语句中有任何错误,则不进行处理。

该函数将始终返回true,因为arrdata永远不会为空

您需要向自己添加else语句 if (sqlite3_prepare_v2(database, [query UTF8String], -1, &connection, nil)==SQLITE_OK)

显示任何错误......

NSLog(@"%s",sqlite3_errmsg(database));