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

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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。