【问题标题】:Inserting value into sqlite table iOS将值插入到 sqlite 表 iOS
【发布时间】:2014-10-29 11:41:02
【问题描述】:

我试图在我的表中插入一些值,但没有收到任何错误,但没有插入值。我将一些值定义为 varchar(100) ,一些是 integer 。如果你通过代码你会得到它。如果有任何步骤。同样在我的表中,一列是 int 主键。这是代码。

      NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"FOM.sql"];
const char *dbpath = [dbPath UTF8String];
sqlite3 *contactDB;

sqlite3_stmt    *statement;
     NSString*size=@"0";
NSString*DateCreated=@"Now";
NSLog(@"db path%@",dbPath);
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
    NSString *insertSQL = @"INSERT INTO MyTable (Name,one,Two,Three,Four,Date) VALUES ('SatTest',5,7,6,'0','Now')";




    NSLog(@"Inser stmt %@",insertSQL);
    const char *insert_stmt = [insertSQL UTF8String];

    sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSLog(@"SqliteDone");
       // sqlite3_bind_text(statement, 1, [Name UTF8String], -1, SQLITE_TRANSIENT);
         //sqlite3_bind_text(statement, 2, [r UTF8String], -1, SQLITE_TRANSIENT);
    } else {
        NSLog(@"error");
         return NO;
    }
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);
}

【问题讨论】:

  • 在我看来,您正在尝试修改捆绑包中数据库的只读副本。 (有大约 100 个关于如何在启动时初始化数据库的示例,如果您搜索它们。)
  • 必须检查sqlite3_prepare_v2()的返回值。

标签: ios iphone sqlite cocoa


【解决方案1】:
    - (NSString *)ExecuteNonQuery:(NSString *)query {
      @try {
           query = [query stringByReplacingOccurrencesOfString:@"'" withString:@"\'"];
           sqlite3_prepare_v2(db, [query UTF8String], -1, &execStatement, NULL);
           if (sqlite3_step(execStatement) == SQLITE_DONE) {
              NSString *temp1 = [NSString stringWithFormat:@"%lld",sqlite3_last_insert_rowid(db)];
              return temp1;
           } else {
               return [NSString stringWithFormat:@"SQL Insert Error\nError Code: %d\n Error Message: %s", sqlite3_errcode(db), sqlite3_errmsg(db)];
           }
           sqlite3_finalize(execStatement);
       }
       @catch (NSException *exception) {
       @throw exception;
       }
       @finally {
           sqlite3_close(db);
       }
     }

     // Double check your query in sqlite manager and try with this code

【讨论】:

  • SQLite 语句不需要使用 try/catch。
  • 我提到的上述代码和 Irshad 给出的代码都设置了值但没有保存它,如果我立即检查,我可以看到数据,但第二次执行数据不存在。跨度>
  • @Sat--VcanShakeTheWorld-- 当您写入只读文件时,数据不会持久化。
【解决方案2】:

我在桌子上做了一些简单的操作,可能对你有帮助:

首先创建 sqldb 对象,例如:sqlite3 *dbObject;

创建数据库

-(NSString *)filePath{

    NSString *documentsDir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"Company.db"];
    //  NSLog(@"DB CREATED");
}

创建表格

-(void)createTable
{

    if(sqlite3_open([[self filePath] UTF8String], &dbObject) == SQLITE_OK) {
        char *err;
        NSString *sqlString=[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS Employee(emp_id INTEGER PRIMARY KEY,emp_name VARCHAR (20),emp_add text);"];

        if (sqlite3_exec(dbObject, [sqlString UTF8String], NULL,NULL,&err)!=SQLITE_OK){
            // created
        }
        else
        {

        }
        sqlite3_close(dbObject);
    }
    else
    {
        NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s ", sqlite3_errmsg(dbObject) );
    }


}

插入数据

-(void)insertData:(NSMutableArray*) mutableArr
{

    if(sqlite3_open([[self filePath] UTF8String], &dbObject) == SQLITE_OK) {
        const char *sqlQuery="INSERT INTO Employee (emp_id,emp_name,emp_add) VALUES (?,?,?)";
        sqlite3_stmt* statement;


        for (NSDictionary  *empdict in mutableArr)
        {

            if( sqlite3_prepare_v2(dbObject, sqlQuery, -1, &statement, NULL) == SQLITE_OK )
            {


                int  card_Id = [empdict valueForKey:@"card_Id"];
                NSString *name =[NSString stringWithFormat:@"%@", [empdict valueForKey:@"name"]];
                NSString *add = [NSString stringWithFormat:@"%@",[empdict valueForKey:@"address"]];

                sqlite3_bind_int(statement,1,card_Id);
                sqlite3_bind_text(statement,2,[name UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(statement,3,[add UTF8String], -1, SQLITE_TRANSIENT);


                sqlite3_step(statement);

            }
            else {
                NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s  ", sqlite3_errmsg(dbObject) );
            }


            sqlite3_finalize(statement);
        }

        sqlite3_close(dbObject);
    }

}

获取所有数据

-(void)getData:(int)empId
{
    if(sqlite3_open([[self filePath] UTF8String], &dbObject) == SQLITE_OK) {

        NSString* sqliteQuery= [NSString stringWithFormat:@"SELECT emp_name FROM Employee  Where emp_id=%i;",empId];


        sqlite3_stmt *compiledStatement;

        if(sqlite3_prepare_v2(dbObject, [sqliteQuery UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK){



            while(sqlite3_step(compiledStatement) == SQLITE_ROW){

                NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];

            }
        }

        else{
            NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s ", sqlite3_errmsg(dbObject) );
        }
        sqlite3_finalize(compiledStatement);

        sqlite3_close(dbObject);
    }
    else{
        NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s ", sqlite3_errmsg(dbObject) );
    }


}

更新

-(void)updateDetails:(NSArray*)arr
{
    sqlite3_stmt *statment;
    for (NSString *tagString in arr) {


        NSString* query = [NSString stringWithFormat:@"UPDATE Employee SET emp_name='ABC'WHERE emp_id=1;"];

        if(sqlite3_prepare_v2(dbObject,[query UTF8String], -1, &statment, NULL)==SQLITE_OK)
        {
            while(sqlite3_step(statment) == SQLITE_DONE)
            {
                NSLog(@"updated  ");
            }
        }

    }
    sqlite3_finalize(statment);
}

删除

- (void)deleteData{


    sqlite3_stmt* statement;

    NSString *query = [NSString stringWithFormat:@"Delete from Employee Where emp_id=1;"];

    if(sqlite3_prepare_v2(dbObject,[query UTF8String], -1, &statement, NULL)==SQLITE_OK)
    {
        while(sqlite3_step(statement) == SQLITE_DONE)
        {
            // record has deleted
        }
        sqlite3_finalize(statement);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多