`

Android使用SQLiteDatabase直接存取数据与图像

 
阅读更多

 

Android使用SQLiteDatabase直接存取数据与图像的简单方法如下:

package com.test;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;

import com.test.R;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class SQLiteDatabaseTest extends Activity {
	/** Called when the activity is first created. */
	private Button btnSave;
	private Button btnLoad;
	private Button btnClear;
	private ImageView imgView;
	private ImageView imgView2;
	private TextView txtView;
	private Bitmap bmp;
	private static SQLiteDatabase db;
	private Context mContext;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		btnSave = (Button) findViewById(R.id.btnSave);
		btnLoad = (Button) findViewById(R.id.btnLoad);
		btnClear = (Button) findViewById(R.id.btnClear);
		imgView = (ImageView) findViewById(R.id.imgView);
		imgView2 = (ImageView) findViewById(R.id.imgView2);
		txtView = (TextView) findViewById(R.id.txtView);
		btnSave.setOnClickListener(new ClickEvent());
		btnLoad.setOnClickListener(new ClickEvent());
		btnClear.setOnClickListener(new ClickEvent());
		imgView2.setImageBitmap(BitmapFactory.decodeResource(getResources(),
				R.drawable.bg));
		mContext = SQLiteDatabaseTest.this;

		// 创建数据库文件
		File path = mContext.getDir("databases", Context.MODE_WORLD_WRITEABLE);
		path = new File(path, "test.db");
		int flag = SQLiteDatabase.OPEN_READWRITE;
		flag = flag | SQLiteDatabase.CREATE_IF_NECESSARY;
		flag = flag | SQLiteDatabase.NO_LOCALIZED_COLLATORS;
                  db = SQLiteDatabase.openDatabase(path.getAbsolutePath(), null, flag);
                  // 创建表
		String sql = "create table if not exists info("
				+ "id integer primary key autoincrement,name varchar(20),"
				+ "time varchar(20),img BLOB)";
                 db.execSQL(sql);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		if (db.isOpen()) {
		      db.close();
		}
		if(!bmp.isRecycled()){
		     bmp.recycle();
		}
	}

	class ClickEvent implements View.OnClickListener {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			if (v == btnSave) {
				Cursor c = db.rawQuery("select * from info", null);
				ContentValues values = new ContentValues();
				c.moveToFirst();
				values.put("name", "test" + (c.getCount() + 1));
				SimpleDateFormat sDateFormat = new SimpleDateFormat(
						"yyyy-MM-dd hh:mm:ss");
				String time = sDateFormat.format(new java.util.Date());
				values.put("time", time);
			    Bitmap bmp = BitmapFactory.decodeResource(getResources(),
						R.drawable.bg);
			    
				if (null != bmp) {	
					//在Bitmap上绘制标签
					Bitmap drawBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.ARGB_8888);
					Canvas cvs = new Canvas(drawBmp);
					Paint p = new Paint();
					p.setColor(Color.RED);
					p.setTextSize(22);
					cvs.drawBitmap(bmp, 0, 0, p);
					cvs.drawText("test" + (c.getCount() + 1), 10, 20,p);
				    //将绘制后Bitmap转为Byte[]并加入values	
					values.put("img", bmpToByteArray(drawBmp));
					drawBmp.recycle();
				}
				db.insert("info", null, values);
				c.close();
				bmp.recycle();

			} else if (v == btnLoad) {
				Cursor c = db.rawQuery("select * from info", null);
				c.moveToLast();
				if (c.isLast()) {
				       String name = c.getString(c.getColumnIndex("name"));
				       txtView.setText("name:" + name + " 共计:" + c.getCount()
							+ " 条");
				       bmp = cursorToBmp(c, c.getColumnIndex("img"));
				       imgView.setImageBitmap(bmp);
				}
				c.close();

			} else if (v == btnClear) {
				imgView.setImageBitmap(null);
			}

		}

	}

	// Bitmap to byte[]
	public byte[] bmpToByteArray(Bitmap bmp) {
	    // Default size is 32 bytes
	    ByteArrayOutputStream bos = new ByteArrayOutputStream();
		try {
			bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
			bos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return bos.toByteArray();
	}

	// Cursor to bitmap
	Bitmap cursorToBmp(Cursor c, int columnIndex) {

		byte[] data = c.getBlob(columnIndex);
		try {
			return BitmapFactory.decodeByteArray(data, 0, data.length);
		} catch (Exception e) {
			return null;
		}
	}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent"
	android:orientation="horizontal">
  <ImageView 
	android:id="@+id/imgView"
	android:layout_width="640dip" 
	android:layout_height="fill_parent"/>
    
   <LinearLayout 
      android:id="@+id/LinearLayout01"
      android:layout_width="150dip" 
      android:layout_height="fill_parent"
      android:layout_marginLeft="5dip"
      android:layout_marginRight="5dip"
      android:orientation="vertical">
                 <ImageView 
	         android:id="@+id/imgView2"
		android:layout_width="fill_parent" 
		android:layout_height="150dip"
		android:layout_marginTop="10dip"/>
	         <Button 
		    android:id="@+id/btnSave" 
		    android:layout_width="fill_parent"
		    android:layout_height="wrap_content" 
		    android:text="保存图像"/>
		<Button 
		    android:id="@+id/btnLoad" 
		    android:layout_width="fill_parent"
		    android:layout_height="wrap_content" 
		    android:text="载入图像"/>
		<Button
		    android:id="@+id/btnClear"
		    android:layout_width="fill_parent"
		    android:layout_height="wrap_content"
		    android:text="清除图像"/>
		<TextView 
		    android:id="@+id/txtView"
		    android:layout_width="fill_parent"
		    android:layout_height="wrap_content"
		    android:textColor="#FFFFFF"
		    android:textSize="22sp"
		    android:text="..."/>

   </LinearLayout>
	
</LinearLayout>

 

开发环境:XP3+Eclipse+Android2.2+JDK6.0
测试环境:Android2.2,5寸屏,分辨率640X480
源代码:http://download.csdn.net/detail/xinzheng_wang/4420817

 

分享到:
评论

相关推荐

    android开发demo集合

    31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、GestureDetector + ViewFlipper实现翻页效果 34、GestureLiberay 自定义手势 35、GestureLiberay 通过自定义的...

    android初学者入门项目

    31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、GestureDetector + ViewFlipper实现翻页效果 34、GestureLiberay 自定义手势 35、GestureLiberay 通过自定义的...

    改进A星算法:实现多个机器人与AGV小车路径规划与动态避障的完整Matlab代码

    内容概要:本文介绍了如何利用改进的A星算法实现多个机器人和AGV小车的路径规划与动态避障。主要内容分为四个部分:首先是环境创建,通过矩阵表示地图并在特定位置设定障碍物;其次是机器人(小车)位置设置,指定起始点和目标点;然后重点讲解了改进后的A星算法,在原有基础上增加了对其他机器人位置和路径的考量,以避免碰撞;最后展示了路径规划的具体步骤以及结果显示方式。此外,文中还提供了详细的代码片段,涵盖从环境构建到路径规划的全过程,并讨论了一些优化技巧如路径冲突检测、动态权重调整等。 适合人群:从事机器人导航系统开发的研究人员和技术爱好者,特别是那些希望深入了解路径规划算法及其应用的人群。 使用场景及目标:适用于需要解决多机器人协作任务的企业和个人开发者,旨在提高自动化设备在复杂环境中的自主行动能力,确保高效且安全地完成预定任务。 其他说明:作者强调了该方法对于仓储物流等行业的重要性,并指出传统A星算法在此类应用场景中存在的局限性。同时提醒读者关注Matlab版本兼容性和实际部署时可能遇到的问题。

    【Windows系统管理】创建任务计划实现软件开机自启动:任务计划配置与BAT脚本自动化方法详解

    内容概要:本文档详细介绍了三种在Windows系统中创建任务计划以实现软件开机启动的方法。第一种方法是通过任务计划创建,包括打开任务计划、设置常规参数、触发器和操作,最终实现软件在系统重启后自动启动;第二种方法是通过降低用户权限来避免软件启动时出现UAC权限询问弹窗,具体步骤为调整用户账户控制设置到最低级别;第三种方法是利用bat脚本创建任务计划,提供了详细的脚本代码,包含管理员权限检查、可配置变量设置、创建任务命令以及相关辅助命令,同时提醒用户注意安全软件可能对任务创建或执行的限制。 适合人群:适用于有一定Windows操作系统使用经验,特别是需要设置软件开机自启动的计算机用户或IT运维人员。 使用场景及目标:①希望在系统重启后自动运行特定软件的用户;②希望通过脚本批量部署开机启动任务的企业IT管理员;③解决软件启动时UAC权限弹窗问题的用户。 阅读建议:对于想要深入了解任务计划创建机制和bat脚本编程的读者来说,建议仔细研究第三种方案中的脚本代码及其说明部分,并尝试在测试环境中进行实践操作。对于普通用户,则重点掌握前两种简单易行的方法即可。

    COMSOL实现双孔单渗透瓦斯抽采:分析煤层内裂隙与基质渗流及应力分布

    内容概要:本文详细介绍了如何使用COMSOL软件构建并实现双孔单渗透瓦斯抽采模型,探讨了煤层内部基质和裂隙的应力分布与渗透率之间的关系。文章首先解释了双孔单渗透模型的基础概念,即瓦斯在基质和裂隙中的流动特性。随后,逐步展示了如何在COMSOL环境中搭建几何模型、定义物理场以及设置材料属性,特别关注了裂隙和基质渗透率的定义及其随应力变化的影响。此外,文章还讨论了多物理场耦合的方法,如将固体力学与地下水流模块相结合,以模拟应力对裂隙渗透率的影响。最后,通过对不同渗透率条件下瓦斯流速和压力分布的模拟,揭示了优化瓦斯抽采方案的关键因素。 适合人群:从事煤矿安全工程、瓦斯抽采研究的专业人士和技术人员。 使用场景及目标:适用于希望深入了解煤层内瓦斯流动机制的研究人员,旨在提高瓦斯抽采效率,确保煤矿生产的安全性和经济性。 其他说明:文中提供了详细的建模步骤和代码片段,帮助读者更好地理解和复现实验结果。同时,强调了模型验证和优化的重要性,提出了若干实用技巧以应对常见的建模挑战。

    Rust高性能日志滚动:RollingFileAppender.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    敏矽微ME32G030系列 keil 扩展包

    敏矽微ME32G030系列 keil 扩展包

    西门子S7-200 Smart PLC与台达MS300变频器及欧姆龙E5CC温控器通讯程序:昆仑通态触摸屏控制实现与扩展模块SB CM01通讯的集成方案

    内容概要:本文详细介绍了如何使用西门子S7-200 Smart PLC与台达MS300变频器和欧姆龙E5CC温控器进行Modbus RTU通讯的具体实现步骤。主要内容涵盖硬件连接、参数设置、PLC程序编写、触摸屏配置等方面。文中不仅提供了详细的参数配置指导,如波特率、数据格式等,还展示了具体的梯形图代码和注意事项,确保各个设备之间的稳定通讯。此外,还分享了一些常见的调试问题及其解决方案。 适合人群:具备一定PLC编程基础的技术人员,尤其是从事自动化控制系统集成工作的工程师。 使用场景及目标:适用于需要集成多种工业设备的自动化控制系统项目,帮助工程师快速掌握不同品牌设备间的通讯方法,提高系统集成效率,减少调试时间和成本。 其他说明:文中提到的所有设备均采用Modbus RTU协议进行通讯,硬件连接主要涉及RS485接口和以太网接口。对于初学者来说,建议先熟悉Modbus协议的基本概念和通讯机制,以便更好地理解和应用本文的内容。

    Rust内存安全指针:NonNull优化技巧.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    大作业自媒体上传需要文档

    大作业自媒体上传需要文档

    基于id=0控制的电机定子参数辨识方法——通过递推最小二乘法对R, ψf, Ls的仿真研究

    内容概要:本文详细介绍了基于id=0控制的电机参数辨识方法,主要采用递推最小二乘法(RLS)对电机定子电阻R、永磁磁链ψf及dq轴电感Ls进行在线辨识。文章首先阐述了id=0控制策略及其优势,接着展示了RLS算法的具体实现过程,包括参数初始化、增益矩阵计算、参数更新和协方差矩阵更新。文中还讨论了采样频率的选择、积分环节的优化以及噪声处理等问题,并通过仿真实验验证了该方法的有效性和稳定性。此外,作者分享了一些实践经验,如针对不同厂家电机的适应性调整和在线参数校验技巧。 适合人群:从事电机控制及相关领域的研究人员和技术人员,尤其是对永磁同步电机参数辨识感兴趣的读者。 使用场景及目标:适用于需要精确辨识电机参数的场合,如高性能电机控制系统的设计与优化。目标是帮助读者掌握RLS算法在电机参数辨识中的应用,提高电机控制系统的性能和可靠性。 其他说明:文章提供了详细的代码示例和仿真结果,便于读者理解和实践。同时强调了物理直觉在参数辨识中的重要性,指出理论模型与实际情况可能存在差异,需灵活应对。

    基于单片机的智能大棚浇花花盆设计:光照、温度和土壤湿度监测与控制系统

    内容概要:本文详细介绍了一个基于单片机的智能大棚与花盆浇花系统的硬件和软件设计方案。硬件方面,系统集成了单片机、光敏电阻、A/D模块PCF8591、DS18B20温度传感器、土壤湿度传感器、1602液晶显示屏、按键、高亮LED灯、补温灯、风扇、继电器和水泵等多种组件。软件部分采用C语言编写,实现了光照、温度和土壤湿度的检测与控制。具体来说,通过光敏电阻和PCF8591进行光照检测与补光控制;利用DS18B20进行温度检测,并根据温度范围控制补温灯和风扇;通过土壤湿度传感器和继电器控制水泵进行精准浇水。此外,还提供了按键设置阈值等功能,确保系统的灵活性和实用性。 适合人群:对嵌入式系统和智能农业感兴趣的电子爱好者、学生和初学者。 使用场景及目标:适用于家庭园艺、小型农场等场合,旨在提供一种低成本、高效的自动化灌溉和环境控制系统,帮助用户更好地管理和维护植物生长环境。 其他说明:文中还提到了一些常见的硬件注意事项和技术细节,如I2C通信、单总线协议、延时处理等,有助于读者理解和调试系统。

    Rust跨语言异常传播:panic处理.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    离合器外圈钻孔专用机床的设计与研究.pdf

    离合器外圈钻孔专用机床的设计与研究.pdf

    基于PLC控制的纯净水灌装生产饮料厂电控系统设计:梯形图程序、接线图与组态画面详解

    内容概要:本文详细介绍了基于PLC(三菱FX3U)的纯净水灌装线电控系统的设计与优化。首先解释了IO分配表的作用及其具体配置,接着深入剖析了梯形图程序的关键逻辑,包括启保停电路、灌装控制逻辑以及保护机制。此外,还探讨了硬件接线的注意事项,如传感器电源隔离、电机接触器保护等。组态画面设计方面,强调了操作便捷性和故障诊断功能。最后分享了一些调试过程中遇到的实际问题及解决方案,如电压骤降引起的随机波动、电磁阀关闭延迟等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC控制系统有兴趣的学习者。 使用场景及目标:适用于希望深入了解PLC控制系统设计原理及应用的技术人员。目标是掌握纯净水灌装线电控系统的完整设计流程,提高系统的稳定性和效率。 其他说明:文中提到的具体案例和实践经验有助于读者更好地理解和应对实际工程中的挑战。

    gaoliwei1102_multi_ML_emtion_analysis_csdn_2660_1746371732584.zip

    gaoliwei1102_multi_ML_emtion_analysis_csdn_2660_1746371732584

    Java企业级开发_SpringBoot_MyBatis_MySQL_Druid_Swagger_Lombok_FastJson_通用Mapper_分页插件_代码生成器_RESTf.zip

    Java企业级开发_SpringBoot_MyBatis_MySQL_Druid_Swagger_Lombok_FastJson_通用Mapper_分页插件_代码生成器_RESTf

    Delphi 12.3控件之RADStudio-12-3-29-0-55362-2017-KeyPatch.7z

    Delphi 12.3控件之RADStudio-12-3-29-0-55362-2017-KeyPatch.7z

Global site tag (gtag.js) - Google Analytics