[英]IOS sqlite update query issues
我對IOS編程非常陌生,因此我不確定如何最好地解決此問題。
我有一個正在顯示在表視圖中的事件的數據庫,當您選擇這些項之一時,它會顯示詳細信息以及將其保存為“收藏夾”的選項,該選項只會更新數據庫中的一列並將其設置為1 。
我有第二個表視圖,用於查找將其“收藏夾”設置為1的所有實例。
我遇到的問題是,我只想出了如何使“ updateItem”數據庫查詢在所選項目的路徑之外起作用。 由於每個表視圖在不同的路徑上顯示相同的項目,因此當您使用“收藏夾”表視圖時,“ updateItem”查詢將更新數據庫中的錯誤項目。
我了解在UpdateItemAtID方法中,它使用aryDatabase,而收藏夾查詢使用aryDatabaseFav。 我不得不創建第二個數組來解決收藏夾表視圖的問題,也許有一種更好的方法可以僅使用原始aryDatabase數組來擁有我想要的一切,而不是擁有2個不同的數組。
這是我為兩個選擇語句以及更新查詢提供的代碼,是否有更好的方法可以繞過項目的路徑?
-(void)readItems {
if (!database) return; // earlier problems
if (!selStmt)
{
const char *sql = "SELECT * FROM Events;";
if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
{
selStmt = nil;
}
}
if (!selStmt)
{
NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}
// loop reading items from list
[aryDatabase removeAllObjects]; // clear list for rebuild
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW)
{ // get the fields from the record set and assign to item
//bindings omitted
[aryDatabase addObject:se]; // add to list
[se release]; // free item
}
sqlite3_reset(selStmt); // reset (unbind) statement
selStmt = nil;}
-(void)readFavItems {
if (!database) return; // earlier problems
if (!selStmt)
{
const char *sql = "SELECT * FROM Events WHERE mySchedule = 1;";
if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
{
selStmt = nil;
}
}
if (!selStmt)
{
NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}
// loop reading items from list
[aryDatabaseFav removeAllObjects]; // clear list for rebuild
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW)
{ // get the fields from the record set and assign to item
//bindings omitted
[aryDatabaseFav addObject:se]; // add to list
[se release]; // free item
}
sqlite3_reset(selStmt); // reset (unbind) statement
selStmt = nil;}
-(void)updateItemAtID:(NSIndexPath *)path {
singleEvent *i = (singleEvent *)[aryDatabase objectAtIndex:path.row];
int ret;
const char *sql = "UPDATE events SET mySchedule = ? WHERE _id = ?;";
if (!updStmt)
{ // build update statement
if ((ret=sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL))!=SQLITE_OK)
{
NSAssert1(0, @"Error building statement to update items [%s]", sqlite3_errmsg(database));
}
}
// bind values to statement
NSInteger m = i.intId;
sqlite3_bind_int(updStmt, 1, m);
NSInteger p = i.intPk;
sqlite3_bind_int(updStmt, 2, p);
if ((ret=sqlite3_step(updStmt)) != SQLITE_DONE)
{
NSAssert1(0, @"Error updating values [%s]", sqlite3_errmsg(database));
}
sqlite3_reset(updStmt);
}
我已經更新了代碼,並在sqlite3_bind_text上獲得了一個result = 0。 是否意味着它已被更新為沒有錯誤或根本沒有記錄被更新? 不知道此時該怎么辦...
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bh.sqlite"];
success = [fileManager fileExistsAtPath:writableDBPath];
NSLog(writableDBPath);
if(success)
{
const char *dbPath= [writableDBPath UTF8String];
//[G msgBox:writableDBPath title:@""];
//const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;
sqlite3 *contactDB = NULL;
if (sqlite3_open(dbPath, &contactDB) == SQLITE_OK)
{
NSString *updateSQL = @"UPDATE account SET name = ? ";
const char *update_stmt = [updateSQL UTF8String];
int e = sqlite3_prepare_v2(contactDB, update_stmt, -1, &statement, nil);
if(e != SQLITE_OK) {
NSLog(@"Problem with updateEntryWithUniqueID");
NSLog(@"Error Code: %d, message '%s'", e, sqlite3_errmsg(contactDB));
return;
}else{
NSLog(@"Updated");
[G setNickname:thisNickname];
}
int result=sqlite3_bind_text(statement, 1, [thisNickname UTF8String], -1, SQLITE_TRANSIENT);
NSLog(@"bind result= %i", result);
if(sqlite3_step(statement) != SQLITE_DONE) {
NSLog(@"Problems updating");
}
/* Finished */
sqlite3_finalize(statement);
}else
{
NSLog(@"Can not open DB.");
}
}else{
NSLog(@"path not exsist"); }
根據我的理解,由於您使用的是NSIndexPath,因此NSArray加載數據時的結構方式似乎有所不同。
我確實建議使用單例對象的以下方法。
Singleton Object的工作方式就像一個容器,在少數視圖控制器或類之間共享。
回到您的問題,您可以將對象(singleEvent)存儲在Singleton中,以供其他uitableview使用。
假設您的singleEvent對象具有鍵字段(例如Id)。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.