2013-11-21 31 views
0

我在sqlite數據庫中有一個區域表。每次我只是在sqlite數據庫上執行插入操作。我如何檢查是否有任何記錄存在或不存在。如果不存在,只需插入。如果存在,則更新記錄。如何檢查然後在sqlite中插入?

請幫幫我。

+0

嘗試此鏈接http://stackoverflow.com/questions/18713462/ios-using-sqlite-database-update-data-not-working – suhit

回答

2

是的,你可以用一個查詢來做到這一點。

INSERT ON CONFLICT IGNORE應該可以幫助您:http://www.sqlite.org/lang_conflict.html

把唯一的鑰匙上的名稱,當您嘗試插入一條記錄,如果該名稱已經存在,這將產生衝突。

缺省值爲ABORT,因此如果沒有IGNORE,語句將返回錯誤。如果你不想要,使用IGNORE。

+0

很好的答案。解決我的問題。非常感謝。 –

1

首先調用在數據庫中獲取記錄查詢。在這裏我添加一個例子,我正在檢查數據庫中可用的用戶登錄信息。所以添加下面的代碼。 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的記錄不在數據庫中可用,因此您必須調用插入查詢

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'

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

這第一種方法是比較安全的,但如果你要,你可以使用第二種方法(雖然你可能會使用交易做ROLLBACK,如果你有任何問題)。不用說,INSERT OR REPLACE方法更容易,但需要一個主鍵。

相關問題