Android Studio:自定义的类型的数据如何从cursor中取出

我自定义了一个Figure类,用DBHelper继承SQLiteOpenHelper,在DBHelper中创建了一个数据表,其中参数有一个自定义的Figure类。
请问利用cursor查询出需要的数据后,Figure类的数据怎么取出?目前只知道getString()和getInt()方法,但这两个都不对。
下面是我的代码:
创建数据库:

//创建数据库表Acounts:_id,账号,昵称,密码,头像ID(0-8),身材信息
String sql = "CREATE TABLE IF NOT EXISTS "+table_Accounts+"(_id INTEGER PRIMARY KEY AUTOINCREMENT,account VARCHAR(20),name VARCHAR(20),password VARCHAR(10),head INT,figure Figure)";
db.execSQL(sql);

Figure类有八个float型参数
获取查询到的数据:

int nameId = cursor1.getColumnIndex("name");
int headId = cursor1.getColumnIndex("head");
int figureId = cursor1.getColumnIndex("figure");
while(cursor1.moveToNext()) {
   Current_username = cursor1.getString(nameId);
   Current_userhead = cursor1.getInt(headId);
   //Current_figure = ?
}

后面获取Figure不会写了,还有将Figure数据保存在Editor对象中,该怎么加入?希望有人指导一下☘️

基于Monster 组和GPT的调写:

  • 在SQLite中存储自定义对象类型需要进行序列化和反序列化操作。你需要在Figure类中实现Serializable接口,并将Figure对象转换为字节数组进行存储。在获取数据时,需要将字节数组反序列化为Figure对象。

下面是一个简单的示例代码,用于演示如何序列化和反序列化Figure对象:

public class Figure implements Serializable {
    private float param1;
    private float param2;
    // ... 其他参数

    public Figure(float param1, float param2, /*... 其他参数*/) {
        this.param1 = param1;
        this.param2 = param2;
        // ... 其他参数初始化
    }

    // Getters and Setters ...
}

// 存储Figure对象到数据库
Figure figure = new Figure(1.0f, 2.0f, /*... 其他参数*/);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(figure);
byte[] figureData = bos.toByteArray();
oos.close();
bos.close();

ContentValues values = new ContentValues();
values.put("figure", figureData);
db.insert(table_Accounts, null, values);

// 获取Figure对象
int figureId = cursor1.getColumnIndex("figure");
while(cursor1.moveToNext()) {
   Current_username = cursor1.getString(nameId);
   Current_userhead = cursor1.getInt(headId);
   byte[] figureData = cursor1.getBlob(figureId);
   ByteArrayInputStream bis = new ByteArrayInputStream(figureData);
   ObjectInputStream ois = new ObjectInputStream(bis);
   Figure figure = (Figure) ois.readObject();
   ois.close();
   bis.close();
   // 通过figure对象获取参数值
}

// 将Figure对象保存在SharedPreferences中
SharedPreferences preferences = getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();

Figure figure = new Figure(1.0f, 2.0f, /*... 其他参数*/);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(figure);
byte[] figureData = bos.toByteArray();
oos.close();
bos.close();

editor.putByteArray("figure_key", figureData);
editor.apply();

// 获取Figure对象
SharedPreferences preferences = getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
byte[] figureData = preferences.getByteArray("figure_key", null);
if (figureData != null) {
    ByteArrayInputStream bis = new ByteArrayInputStream(figureData);
    ObjectInputStream ois = new ObjectInputStream(bis);
    Figure figure = (Figure) ois.readObject();
    ois.close();
    bis.close();
    // 通过figure对象获取参数值
}


由于Java对象的序列化和反序列化需要进行IO操作,因此建议在较少频率的场景下使用该方法存储和获取自定义对象类型。如果需要频繁进行存储和获取操作,建议使用SQLite支持的其他数据类型,如TEXT或BLOB类型,将对象转换为JSON字符串或字节数组进行存储。