2 Stimmen

Wie erhalte ich auf dem iPhone die Kennung der letzten eingefügten Zeile in Sqlite?

Ich mache eine Anwendung, in der ich eine Aktualisierungsabfrage verwenden möchte?

In meiner Anwendung gibt es zwei Stufen, um den Registrierungsprozess abzuschließen

Auf Seite 1 habe ich ein Anmeldeformular und eine Schaltfläche zum Absenden?

beim Klicken auf die Schaltfläche "Senden" sollten alle Details in meine Sqlite-Tabelle eingefügt werden.

Auf Seite 2 habe ich eine Bestätigungsseite und eine Schaltfläche zum Bearbeiten und Fortfahren?

alle Werte, die in einer Tabelle gespeichert sind, sollten vom Benutzer auf dieser Seite angezeigt werden, und wenn er eine Änderung vornehmen möchte, sollte er in der Lage sein, dies zu tun. Sobald der Benutzer einen Wert bearbeitet hat und er auf die Schaltfläche "Weiter" drückt, sollten alle eingefügten Werte aktualisiert werden?

aber ich habe versucht, dies zu tun, aber ich bin nicht in der Lage, den zuletzt eingegebenen Wert zu aktualisieren?

Im Folgenden finden Sie meinen Code Seite1 Code einfügen:

-(void)submit
{

    if( ([UserName.text isEqualToString:@""]) || ([Password.text isEqualToString:@""]) || 
        ([ConfirmPassword.text isEqualToString:@""]) || ([Name.text isEqualToString:@""]) || 
        ([Email.text isEqualToString:@""]) || ([ContactNO.text isEqualToString:@""]) || 
        ([MobileNo.text isEqualToString:@""]) || ([Address.text isEqualToString:@""]) )

    {

        UIAlertView *ErrorAlert = [[UIAlertView alloc] initWithTitle:@"Error!!" 
                                                                 message:@"Please fill in the details." delegate:nil
                                                       cancelButtonTitle:@"OK"
                                                       otherButtonTitles:nil, nil];
            [ErrorAlert show];
            [ErrorAlert release];
        }
        else 
        {
            Confirmation_form *conForm = [[Confirmation_form alloc] initWithNibName:@"Confirmation_form" bundle:nil];
            conForm.data = UserName.text;
            conForm.data1 = Password.text;
            conForm.data2 = ConfirmPassword.text;
            conForm.data3 = Name.text;
            conForm.data4 = Email.text;
            conForm.data5 = ContactNO.text;
            conForm.data6 = MobileNo.text;
            conForm.data7 = Address.text;

            sqlite3_stmt  *statement;
            const char *dbpath = [databasePath UTF8String];
            if (sqlite3_open(dbpath, &test1DB) == SQLITE_OK)
            {

                NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO test(UserName, Password, ConfirmPassword, Name, Email, ContactNO, MobileNo, Address) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",UserName.text, Password.text, ConfirmPassword.text, Name.text, Email.text, ContactNO.text, MobileNo.text, Address.text];
                const char *insert_stmt = [insertSQL UTF8String];
                sqlite3_prepare_v2(test1DB, insert_stmt, -1, &statement, NULL);
                if(sqlite3_step(statement) == SQLITE_DONE)
                {
                    //status.text = @"Contact added";
                    UserName.text = @"";
                    Password.text = @"";
                    ConfirmPassword.text = @"";
                    Name.text = @"";
                    Email.text = @"";
                    ContactNO.text = @"";
                    MobileNo.text = @"";
                    Address.text = @"";

                    sqlite3_last_insert_rowid;
                    rowID = sqlite3_last_insert_rowid(test1DB);
                    NSLog(@"last inserted rowId = %d",rowID);

                    sqlite3_reset(statement);
                    sqlite3_finalize(statement);
                    sqlite3_close(test1DB);

                    [self.navigationController pushViewController:conForm animated:YES];

                }                   
            }

        }
    }

Mit dem obigen Code kann ich die Zeilen-ID abrufen, aber ich kann diese Zeilen-ID nicht in der Aktualisierungsabfrage verwenden.

Im Folgenden finden Sie meinen Code Seite2 Code aktualisieren:

-(IBAction)Update;
{

sqlite3_stmt  *statement;
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &test1DB) == SQLITE_OK)
{
    NSString *insertSQL = [NSString stringWithFormat:@"UPDATE test SET UserName='%@',Password='%@',ConfirmPassword='%@',Name='%@',Email='%@',ContactNO='%@',MobileNO='%@',Address='%@'WHERE ID='%@'",UserName.text,Password.text,ConfirmPassword.text, Name.text, Email.text, ContactNO.text, MobileNo.text, Address.text, sqlite3_last_insert_rowid(test1DB)];

    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(test1DB, insert_stmt, -1, &statement, NULL);
    if(sqlite3_step(statement) == SQLITE_DONE)
    {
        sqlite3_step(statement);
                                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                                    [alert show];
                                    [alert release];
                                    alert = nil;    
        sqlite3_finalize(statement);
        sqlite3_close(test1DB);
    }

    else {
        sqlite3_step(statement);
                        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record notadded" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                        [alert show];
                        [alert release];
                        alert = nil;    
         }
}

}

0 Stimmen

Ich habe auch einen kurzen Bericht geschrieben Lehrgang die diese Implementierung beinhaltet.

15voto

NSInteger lastRowId = sqlite3_last_insert_rowid(yourdatabasename);

6voto

bryanmac Punkte 38186

Sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);

http://www.sqlite.org/c3ref/last_insert_rowid.html

EDITAR: Rufen Sie diese Funktion nach dem Aufruf der Einfügefunktion auf, erhalten Sie die ID zurück.

Auch:

Sie bereiten Ihre Anweisung vor (wodurch die SQL kompiliert wird), aber Sie speichern sie nicht ab. Speichern Sie einen Verweis auf diese Anweisung und rufen Sie reset auf, bevor Sie sie erneut verwenden. Dadurch wird die Kompilierung gespeichert.

EDITAR:

sqlite3_prepare_v2 gibt einen Verweis (&) auf eine Anweisung zurück. Speichern Sie diese in einer Mitgliedsvariablen und rufen Sie prepare nicht erneut auf. Da Sie schrittweise durch die Ergebnisse gehen, müssen Sie, wenn Sie die Anweisung erneut verwenden, sqlite3_reset() für die Anweisung aufrufen und dann step aufrufen, damit sie erneut ausgeführt wird, ohne dass die SQL-Anweisung neu kompiliert (geparst) wird. Dies ist eine Optimierung.

Sie überprüfen nicht die Rückgabewerte Ihrer Sqlite-Aufrufe. Überprüfen Sie diese immer und protokollieren Sie sie zumindest - aber das sollte wirklich geschehen. Andernfalls bewegen Sie sich stillschweigend über ein Problem und einen Fehler später, wo es schwieriger zu entdecken ist.

EDITAR:

jeder Sqlite-Aufruf kann fehlschlagen oder Probleme verursachen. Siehe die Funktion close, auf die ich unten verweise. Fast jede Funktion gibt einen Rückgabewert zurück. Überprüfen Sie sie, protokollieren sie usw...

Schließlich muss Ihr Abschluss robuster sein. Siehe die Funktion schließen in diesem SO Beitrag:

Sqlite in iOS Speicherprobleme

0 Stimmen

Sie lesen die letzte ID unmittelbar nach dem Einfügen (wie Sie es getan haben). Zu diesem Zeitpunkt sollten Sie diese ID an die Aktualisierungsseite weitergeben. Lassen Sie die Aktualisierungsseite nicht die zuletzt eingefügte ID lesen, da dies zu einer sehr seltsamen Kopplung führt. Zum Beispiel können Sie die Aktualisierungsseite verwenden, um nachträglich zu aktualisieren, und diese ID wird nicht unbedingt die letzte in SQL geänderte Zeilen-ID sein. Übergeben Sie sie.

0 Stimmen

Auch in Ihrem Update-Anweisung, Ihre Formatierung der int64 mit %@. Das ist nicht die richtige Formatanweisung - protokollieren Sie Ihre Anweisungen.

0 Stimmen

Hallo nilesh check this link it will help you iphonedevsdk.com/forum/iphone-sdk-entwicklung/

-1voto

Spydy Punkte 2467

Sie müssen Folgendes einstellen rowid anstelle von ID . der Rest des Codes ist in Ordnung

NSString *insertSQL = [NSString stringWithFormat:@"UPDATE test 
   SET UserName='%@',Password='%@',ConfirmPassword='%@',Name='%@',Email='%@',
   ContactNO='%@',MobileNO='%@',Address='%@'WHERE rowid='%@'",UserName.text,
   Password.text,ConfirmPassword.text, Name.text, Email.text, ContactNO.text,
   MobileNo.text, Address.text, sqlite3_last_insert_rowid(test1DB)];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X