我在sqlite数据库中有一个区域表。每次我只是在sqlite数据库上执行插入操作。我如何检查是否存在任何记录。如果不存在,只需插入。如果存在则更新记录。
请帮帮我。
答案 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
,则必须将其分为两个步骤:
使用SELECT
查找记录:如果找到,请执行UPDATE
;如果找不到,请执行INSERT
。
首先DELETE
任何符合您所需条件的记录,然后执行INSERT
。
这第一种方法有点安全,但如果你不得不使用第二种方法(尽管如果你有任何问题,你可能会使用事务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'
。