Android Studio中如何在SQLite数据库存储图片?
解决Android答题应用中SQLite存储图片资源的问题
问题根源分析
你当前遇到的问题,核心是数据库中存储的图片ID并非预期的有效整数:
- 第一次插入时,
R.drawable.wvg会被当作字符串存入INTEGER字段,SQLite转换失败后会存为0,导致cursor.getInt(2)取到无效值,无法显示图片。 - 第二次修改为硬编码ID后,若未重建数据库表,旧的错误数据依然存在,所以取到的还是无效值。
另外,硬编码资源ID的方式本身存在缺陷——R类的资源ID是编译时生成的,后续修改资源、打包不同版本时ID可能会变化,导致数据库中的数据直接失效。
优雅的解决方案:存储图片资源名称
推荐在数据库中存储图片的资源名称(如"wvg"),而非硬编码ID,既灵活又能避免ID变动的问题,具体步骤如下:
- 修改表结构,将image字段设为TEXT类型
SQLiteDatabase gdb = openOrCreateDatabase(gdbName, MODE_PRIVATE, null); // 先删除旧表(如果存在),避免数据冲突 gdb.execSQL("DROP TABLE IF EXISTS " + gdbTabelle); // 创建新表,image字段改为TEXT类型 gdb.execSQL("CREATE TABLE " + gdbTabelle + "(id INTEGER PRIMARY KEY, question TEXT, image TEXT, rightAnswer TEXT, alreadyAnswered INTEGER)"); // 插入数据时,存入图片的资源名称(不含R.drawable前缀) gdb.execSQL("INSERT INTO " + gdbTabelle + " VALUES(1, 'When did Germany reunify', 'wvg', '03.10.1990', 0)"); gdb.close();
- 查询时通过资源名称动态获取ID并显示图片
从数据库取出资源名称后,用getResources().getIdentifier()获取对应资源ID,再设置到ImageView:
// 从Cursor中获取图片资源名称 String imageName = cursor.getString(2); // 获取对应的资源ID int imageResId = getResources().getIdentifier(imageName, "drawable", getPackageName()); // 设置图片,同时处理资源不存在的情况 if (imageResId != 0) { imField.setImageResource(imageResId); } else { // 显示默认图片或提示 imField.setImageResource(R.drawable.default_image); }
临时验证硬编码ID的方法
如果只是想临时验证硬编码ID的有效性,需要确保数据库数据更新:
- 在创建表前执行
DROP TABLE IF EXISTS " + gdbTabelle,强制重建表; - 调试时打印
cursor.getInt(2)的值,确认是否等于你插入的2131165395,若不等于则说明数据未更新成功。
内容的提问来源于stack exchange,提问作者Wotan2004
相关产品推荐
相关产品推荐

