2016-07-26 9 views
3

Ich versuche einfache CRUD-Datenbankoperationen zu implementieren, im Falle einer UPDATE-Operation wechselt der Benutzer zu einem anderen Bildschirm, wo er die neuen und alten Werte für die zu aktualisierende Spalte eingibt Beim Wechsel zur nächsten Aktivität möchte ich das Objekt der in MainActivity erstellten Datenbankklasse an UpdateActivity übergeben. Ich habe es versucht, indem ich die Datenbankklasse Serializbale implementiert habe, aber es stürzt ab.Übergeben des Datenbankklassenobjekts von der Hauptaktivität an eine andere Aktivität

java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object 

Hier ist der Code i

versucht

MainActivity

MyDbHandler dbObj = new MyDBHandler(this, null, null, 1); 

public void updateBtnClicked(View view) 
{ 

    Intent intent = new Intent(MainActivity.this, ActivityUpdate.class); 
    intent.putExtra("Object", dbObj); 
    startActivity(intent); 

} 

ActivityUpdate

intent = getIntent(); 

dbObj2 = (MyDBHandler) intent.getSerializableExtra("Object"); 

public void doneButtonClicked(View view) 
{ 

    String str1 = newValue.getText().toString(); 
    String str2 = oldValue.getText().toString(); 

    dbObj2.updateProduct(str1, str2); 

    finish(); 

} 

So, wie die Datenbank-Klasse-Objekt von einer auf eine andere Tätigkeit weitergegeben werden konnten? Danke

Antwort

2

wie könnte die Datenbank-Klasse-Objekt von einer auf eine andere Tätigkeit weitergegeben werden

Sie keine Datenbankobjekte serialisiert. Sie fordern sie erneut an.

MyDbHandler dbHandler = new MyDbHandler(MainActivity.this); // pass your Activity here 
dbHandler.update(new Foo(42)); 

Wo MyDbHandler einige Erweiterung von SQLiteOpenHelper wie so geschrieben

public class MyDbHandler extends SQLiteOpenHelper { 
    // Database Info 
    private static final String DATABASE_NAME = "DatabaseName"; 
    private static final int DATABASE_VERSION = 1; 

    public MyDbHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion != newVersion) { 
      // TODO 
     } 

    /** 
    * Update method defined here 
    **/ 
    public void update(Foo bar) { 
     SQLiteDatabase db = getWritableDatabase(); 
     // TODO: Write to & close the database 
    } 
} 
+0

Das bedeutet, dass wir in jeder Aktivität eine DB-Operation ausführen wollen, haben wir ein neues Objekt der DB-Klasse erstellt und übergeben die aktuelle Aktivität als Kontext? zB in meinem Fall, was Sie vorgeschlagen haben, das Objekt der DB-Klasse in MainActivity zu erstellen, was ich bereits mache, aber die Update-Aufgabe, die ich von einer anderen Aktivität ActivityUpdate und derselben Codezeile ausführen möchte, wie Sie in der ersten Zeile erwähnt haben, ActivityUpdate dort anstelle von MainActivity sein? – shehzy

+0

Richtig, ich habe nur ein Beispiel. Sie brauchen einfach einen Kontext –

1

MyDbHandler muss Serializable erweitern, um korrekt serialisiert zu werden.

+1

cricket_007 ist richtig, dass die Serialisierung für Datenbank-Handler Instanziierung nicht notwendig ist. Befolgen Sie in diesem Fall seinen Rat. –

+0

Wenn Sie das Gefühl haben, dass Sie falsch sind, können Sie die Antwort löschen. Das liegt an dir, aber –

+0

Ich denke, dass dieser Rat wert ist zu bewahren, da der ursprüngliche Fehler, den Shehzy gepostet hat, ein Serialisierungsfehler war. Es ist erwähnenswert für zukünftige Referenz, unabhängig davon, ob die Fixierung der Serialisierung in diesem Fall notwendig ist. –

Verwandte Themen