从主活动传递数据库类对象到另一个活动

5

我正在尝试实现简单的数据库CRUD操作,在更新操作的情况下,用户会转到另一个屏幕,在那里他将输入他想要更新的列的新旧值,所以在移动到下一个活动时,我想将在MainActivity中创建的Database类对象传递给UpdateActivity。我试着通过实现可序列化的Database类来尝试它,但它崩溃了。

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

这里是我尝试的代码。
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);

}

活动更新

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();

}

那么如何将数据库类对象从一个活动传递到另一个活动呢?谢谢。
2个回答

2
怎样才能将数据库类对象从一个活动传递到另一个活动?
不要对数据库对象进行序列化操作,应该重新请求。
MyDbHandler dbHandler = new MyDbHandler(MainActivity.this);  // pass your Activity here 
dbHandler.update(new Foo(42));

这里的MyDbHandler是一种类似于SQLiteOpenHelper的扩展,其代码如下:

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
    }
}

这意味着在每个Activity中,我们想要执行一些DB操作时,我们必须创建一个新的DB类对象并将当前Activity作为上下文传递?例如,在我的情况下,您建议在MainActivity中创建DB类对象,这就是我已经在做的事情,但我想从另一个Activity ActivityUpdate执行更新任务,并且与您在第一行提到的代码相同,但ActivityUpdate将代替MainActivity出现? - shehzy
正确,我只是举了一个例子。你只需要一个上下文。 - OneCricketeer

1

为了正确序列化,MyDbHandler必须扩展Serializable。


1
cricket_007 是正确的,对于数据库处理程序的实例化,序列化是不必要的。在这种情况下,请遵循他的建议。 - Mr. Negi
如果您觉得翻译有误,可以删除答案。但这取决于您。 - OneCricketeer
我认为这个建议值得保留,因为shehzy最初发布的错误是一个序列化错误。无论在这种情况下是否需要修复序列化,都值得将其作为未来参考提及。 - Mr. Negi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接