如何将drawable文件夹中的XML Drawable转为String并存储到SQLite
XML Drawable转String存储到SQLite实现方案
分为两种常用实现路径,可根据你的实际需求选择:
方案1:存储XML源文本(适合无外部资源引用的Drawable XML)
- 第一步:通过资源ID读取XML输入流
// 替换为你的XML Drawable对应的资源ID InputStream inputStream = getResources().openRawResource(R.drawable.xxx); - 第二步:将输入流转换为字符串
public String streamToString(InputStream inputStream) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } br.close(); return sb.toString(); } - 第三步:将得到的字符串直接存入SQLite的
TEXT类型字段即可 - 还原Drawable方法:
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(new StringReader(从SQLite读取的XML字符串)); Drawable drawable = Drawable.createFromXml(getResources(), parser);
注意:如果你的XML Drawable引用了其他资源(比如color、dimen等),直接读取源文本还原时会找不到对应资源,这种情况请使用方案2
方案2:存储Drawable渲染后转Base64的字符串(兼容性最好)
- 第一步:将XML Drawable渲染为Bitmap
Drawable originDrawable = ContextCompat.getDrawable(context, R.drawable.xxx); Bitmap bitmap = Bitmap.createBitmap(originDrawable.getIntrinsicWidth(), originDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); originDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); originDrawable.draw(canvas); - 第二步:将Bitmap转Base64字符串
ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] bitmapBytes = baos.toByteArray(); String base64Str = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); - 第三步:将Base64字符串存入SQLite的
TEXT类型字段即可 - 还原Drawable方法:
byte[] bytes = Base64.decode(从SQLite读取的Base64字符串, Base64.DEFAULT); Drawable drawable = new BitmapDrawable(getResources(), BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
内容的提问来源于stack exchange,提问作者AtomicallyBeyond
相关产品推荐
相关产品推荐

