llf2580 2023-03-10 17:20 采纳率: 66.7%
浏览 23
已结题

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对象中,该怎么加入?希望有人指导一下☘️

  • 写回答

1条回答 默认 最新

  • 社区专家-Monster-XH 2023-03-10 17:50
    关注

    基于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字符串或字节数组进行存储。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 修改了问题 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 (标签-STM32|关键词-智能小车)
  • ¥20 关于#stm32#的问题,请各位专家解答!
  • ¥15 (标签-python)
  • ¥20 搭建awx,试了很多版本都有错
  • ¥15 java corba的客户端该如何指定使用本地某个固定IP去连接服务端?
  • ¥15 activiti工作流问题,求解答
  • ¥15 有人写过RPA后台管理系统么?
  • ¥15 Bioage计算生物学年龄
  • ¥20 如何将FPGA Alveo U50恢复原来出厂设置哇?
  • ¥50 cocos2d-x lua 在mac上接入lua protobuf?