如何检查然后插入sqlite?

时间:2013-11-21 12:48:31

标签: ios sqlite

我在sqlite数据库中有一个区域表。每次我只是在sqlite数据库上执行插入操作。我如何检查是否存在任何记录。如果不存在,只需插入。如果存在则更新记录。

请帮帮我。

5 个答案:

答案 0 :(得分:4)

你可以轻松地做到"插入或忽略tbl_name" 在这里你可以看到这个例子 http://www.raywenderlich.com/913/sqlite-tutorial-for-ios-making-our-app 这对你有用.... http://www.sqlite.org/lang_conflict.html

答案 1 :(得分:2)

是的,你可以用一个查询来做到这一点。

INSERT ON CONFLICT IGNORE应该帮助你:http://www.sqlite.org/lang_conflict.html

在名称上放置一个唯一键,如果名称已存在,当您尝试插入记录时,这将产生冲突。

默认值为ABORT,因此如果没有IGNORE,语句将返回错误。如果您不想这样,请使用IGNORE。

答案 2 :(得分:2)

如果桌面上有主键,则可以INSERT OR REPLACE。例如:

sqlite3 *database = NULL;

NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *path = [documentsPath stringByAppendingPathComponent:@"test.sqlite"];

int rc = sqlite3_open([path UTF8String], &database);
NSAssert(rc == SQLITE_OK, @"Open failed");

// note, use PRIMARY KEY when creating table

rc = sqlite3_exec(database, "CREATE TABLE IF NOT EXISTS test (animal TEXT PRIMARY KEY, sound TEXT)", NULL, NULL, NULL);
NSAssert(rc == SQLITE_OK, @"Create failed: %s", sqlite3_errmsg(database));

// create a record that will be replaced by the subsequent `INSERT OR REPLACE`

rc = sqlite3_exec(database, "INSERT INTO test (animal, sound) VALUES ('dog', 'meow')", NULL, NULL, NULL);
NSAssert(rc == SQLITE_OK, @"INSERT failed: %s", sqlite3_errmsg(database));

// this will REPLACE entry if value with same PK found, otherwise it would INSERT

rc = sqlite3_exec(database, "INSERT OR REPLACE INTO test (animal, sound) VALUES ('dog', 'woof')", NULL, NULL, NULL);
NSAssert(rc == SQLITE_OK, @"INSERT failed: %s", sqlite3_errmsg(database));

// now retrieve values and make sure it worked like we thought it would

sqlite3_stmt *statement = NULL;
rc = sqlite3_prepare_v2(database, "SELECT animal, sound FROM test", -1, &statement, NULL);
NSAssert(rc == SQLITE_OK, @"prepare SELECT failed: %s", sqlite3_errmsg(database));

while ((rc = sqlite3_step(statement)) == SQLITE_ROW) {
    const unsigned char *animal = sqlite3_column_text(statement, 0);
    const unsigned char *sound  = sqlite3_column_text(statement, 1);
    NSLog(@"%s goes %s", animal, sound);
}
NSAssert(rc == SQLITE_DONE, @"step failed: %s", sqlite3_errmsg(database));

sqlite3_finalize(statement);

sqlite3_close(database);

这将报告INSERT OR REPLACE替换了先前的值而不是插入第二条记录:

2013-11-21 08:59:25.285 AnimalSounds[53549:70b] dog goes woof

如果您没有主键,而不是这个简单的INSERT OR REPLACE,则必须将其分为两个步骤:

  1. 使用SELECT查找记录:如果找到,请执行UPDATE;如果找不到,请执行INSERT

  2. 首先DELETE任何符合您所需条件的记录,然后执行INSERT

  3. 这第一种方法有点安全,但如果你不得不使用第二种方法(尽管如果你有任何问题,你可能会使用事务ROLLBACK)。不用说,INSERT OR REPLACE方法更容易,但需要主键。

答案 3 :(得分:1)

首先在数据库中调用get记录查询。这里我添加一个例子,我正在检查数据库中是否有用户登录信息。所以添加下面的代码。 IF用户记录可用,而不是我获得记录数组,否则为零。

 +(NSArray*)getTBL_LOGIN
{
    NSMutableArray *Favourite=[[NSMutableArray alloc]init];

 sqlite3 *database;

 TabBarAppDelegate *x=(TabBarAppDelegate*)[[UIApplication sharedApplication]delegate];
if(sqlite3_open([[x dataBasePath] UTF8String],&database) == SQLITE_OK) {
    NSString *str = [NSString stringWithFormat:@"select * from tbl_login"];
    const char *sqlStmt=[str UTF8String];             
    sqlite3_stmt *compiledStmt;                           
    if(sqlite3_prepare_v2(database, sqlStmt, -1, &compiledStmt, NULL) == SQLITE_OK) {
    while(sqlite3_step(compiledStmt)==SQLITE_ROW) 
            {
                NSString *uid=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStmt, 0)];

                NSString *username=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStmt, 1)];


                NSDictionary *d=[NSDictionary dictionaryWithObjectsAndKeys:uid,@"uid",username,@"username",nil];
        [Favourite addObject:d];
    }
    }
    sqlite3_finalize(compiledStmt);
}
sqlite3_close(database);

if([Favourite count]>0)
{
    NSArray *ar=[NSArray arrayWithArray:Favourite];
    return ar;
} else {
    return nil;
}
}

如果您获得记录计数> = 1则记录存在,因此如果您获得记录计数0而不是记录在数据库中不可用,则必须调用更新查询,因此您必须调用插入查询

答案 4 :(得分:1)

在我将所有更新导入另一个数据库表的情况下,我可以使用以下内容:

-- Existing table: t(uc UNIQUE, v1, v2, v3);
-- Updates table: ut(uc UNIQUE, v2);
INSERT OR REPLACE INTO t
    SELECT ut.uc, et.v1, ut.v2, et.v3 FROM ut
    LEFT JOIN t AS et ON ut.uc=et.uc;

此语句会将ut中的新行插入t。现有行将替换为包含ut中的新数据和来自t的现有数据的行。

要使其正常工作,您必须拥有UNIQUE列(当您正在寻找行更新或插入新行时这是有意义的),并且有新数据可供查询(在同一列中)或其他数据库)。

这对我有用,希望它可以帮到你。

另一个可能具有更好性能的解决方案是使用两个语句:

 UPDATE t SET v1='some value', v2=123 WHERE unique_col='some_id';
 INSERT OR IGNORE t(v1, v2, unique_col) VALUES('some value', 123, 'some_id');
如果找不到UPDATE

'some_id'将成为空操作。 INSERT会忽略所有现有的'some_id'